Estoy tratando de escribir un script donde quiero verificar si alguno de los parámetros pasados a un script bash coincide con una cadena. La forma en que lo configuro ahora es
if [ "$3" != "-disCopperBld" -a "$4" != "-disCopperBld" -a "$5" != "-disCopperBld" -a "$6" != "-disCopperBld"]
pero puede haber una gran cantidad de parámetros, por lo que me preguntaba si hay una mejor manera de hacer esto.
Gracias
EDITAR: probé este fragmento de código y llamé al script con la opción, -disableVenusBld, pero aún imprime "Iniciando compilación". ¿Estoy haciendo algo mal? ¡Gracias por adelantado!
while [ $# -ne 0 ]
do
arg="$1"
case "$arg" in
-disableVenusBld)
disableVenusBld=true
;;
-disableCopperBld)
disableCopperBld=true
;;
-disableTest)
disableTest=true
;;
-disableUpdate)
disableUpdate=true
;;
*)
nothing="true"
;;
esac
shift
done
if [ "$disableVenusBld" != true ]; then
echo "Starting build"
fi
linux
unix
bash
shell-script
iman453
fuente
fuente
#! /bin/sh -
a la parte superior de lo que has incluido allí, hice que el script fuera ejecutable, luego./t.sh
imprime "Iniciando compilación", pero./t.sh -disableVenusBld
no imprime nada.Respuestas:
Parece que estás manejando opciones en un script de shell. Aquí está el modismo para eso:
(Hay un par de convenciones para sangrar el
;;
, y algunos shells le permiten dar las opciones como(--opt1)
, para ayudar con la combinación de llaves, pero esta es la idea básica)fuente
shift
declaración se usa cuando el número de argumentos de un comando no se conoce de antemano, por ejemplo, cuando los usuarios pueden dar tantos argumentos como quieran. En tales casos, los argumentos se procesan en unwhile
bucle con una condición de prueba de$#
. Esta condición es verdadera siempre que el número de argumentos sea mayor que cero. La$1
variable y lashift
declaración procesan cada argumento. El número de argumentos se reduce cada vez queshift
se ejecuta y finalmente se convierte en cero, sobre el cualwhile
sale el bucle. fuenteecho $1 | sed
procesamiento de valor de argumento adicional .Esto funcionó para mí. Hace exactamente lo que pidió y nada más (sin procesamiento de opciones). Si eso es bueno o malo es un ejercicio para el afiche :)
Esto aprovecha el manejo especial de
$*
bash super-test[[
...]]
brackets.fuente
$*
a$@
, ya que la cadena a probar podría tener espacios y agregar un enlace a la documentación de bash al respecto.bash -c 'echo args=$*; [[ "$@" == "bar" ]] && echo YES || echo NO' -- foo bar
your string
. Creo que debe hacer lo que sugiere esta respuesta . es decir:bash -c 'echo args=$*; for i in "$@" ; do [[ $i == "bar" ]] && echo "Is set!" && break ; done' -- bar foo
funcionaríacreate a new certificate
y "su cadena" escat
, esto informará una coincidencia porquecertificate
contienecat
.¿Qué tal buscar (con comodines) todo el espacio de parámetros:
Editar: Ok, ok, entonces esa no era una respuesta popular. ¿Qué tal este, es perfecto !:
Edit2: Ok, ok, tal vez esto no sea perfecto ... Creo que funciona solo si -param está al comienzo de la lista y también coincidirá con -paramXZY o -paramABC. Sigo pensando que el problema original se puede resolver muy bien con la manipulación de bash string, pero no lo he resuelto aquí ... ¿Puedes?
fuente
${@#
)?$@
es una variable especial que contiene todos los argumentos de la línea de comandos? Bueno, acabo de utilizar la manipulación de cadenas Bash en esa variable para eliminar la subcadena "-disableVenusBld", y luego la comparo con la original$@
. Entonces, si$@
es igual,-foo -bar
entonces${@#-disableVenusBld}
todavía lo sería-foo -bar
, por lo que puedo ver que la bandera que estoy buscando no está presente. Sin embargo, si$@
es igual,-foo -disableVenusBld -bar
entonces${@#-disableVenusBld}
sería lo-foo -bar
que no es igual$@
, ¡lo que me dice que la bandera que estoy buscando está presente! Genial eh!Si necesita probar solo los parámetros a partir de
$3
, realice la búsqueda en una función:Pero me pregunto por qué estás tratando de hacer esto en primer lugar, no es una necesidad común. Por lo general, procesaría las opciones en orden, como en la respuesta de Dennis a su pregunta anterior .
fuente