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.shimprime "Iniciando compilación", pero./t.sh -disableVenusBldno 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
shiftdeclaració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 unwhilebucle con una condición de prueba de$#. Esta condición es verdadera siempre que el número de argumentos sea mayor que cero. La$1variable y lashiftdeclaración procesan cada argumento. El número de argumentos se reduce cada vez queshiftse ejecuta y finalmente se convierte en cero, sobre el cualwhilesale el bucle. fuenteecho $1 | sedprocesamiento 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 baryour 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 foofuncionaríacreate a new certificatey "su cadena" escat, esto informará una coincidencia porquecertificatecontienecat.¿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 -barentonces${@#-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 -barentonces${@#-disableVenusBld}sería lo-foo -barque 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