93 votos

Compruebe si alguno de los parámetros para un script de bash que coincida con una cadena

Estoy tratando de escribir un guión donde quiero comprobar si alguno de los parámetros pasados a un script de bash que coincida con una cadena. La forma en que lo he ajustado a la derecha ahora es

if [ "$3" != "-disCopperBld" -a "$4" != "-disCopperBld" -a "$5" != "-disCopperBld" -a "$6" != "-disCopperBld"]

pero podría haber un gran número de parámetros, así que me preguntaba si hay una manera mejor de hacer esto?

Gracias

EDITAR: He probado este fragmento de código, y llamó a la secuencia de comandos con la opción-disableVenusBld, pero todavía se imprime "a Partir de construir". Estoy haciendo algo mal? Gracias de antemano!

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

75voto

Norman Gray Puntos 451

Parece que estamos haciendo el manejo de opción en un script de shell. He aquí el sentido de que:

#! /bin/sh -

# idiomatic parameter and option handling in sh
while test $# -gt 0
do
    case "$1" in
        --opt1) echo "option 1"
            ;;
        --opt2) echo "option 2"
            ;;
        --*) echo "bad option $1"
            ;;
        *) echo "argument $1"
            ;;
    esac
    shift
done

exit 0

(Hay un par de convenios para la sangría de la ;;, y algunas conchas permiten dar opciones como (--opt1), para ayudar con la concordancia, pero esta es la idea básica)

54voto

Lark Puntos 1640

Esto funcionó para mí. Hace exactamente lo que le pidió nada más (no hay opción de procesamiento). Si eso es bueno o malo es un ejercicio para el cartel :)

if [[ "$@" == "your string" ]]
then
    echo "YES"
else
    echo "NO"
fi

Tenga en cuenta que el uso de $@, en lugar de $*, junto con el hecho de que es citado, garantiza la flexibilidad en el caso de una cadena de prueba con whitespeces. Con $* sólo "your" o "string" sería igualado. No habría ninguna diferencia, sin embargo, si no hay espacios en blanco.

Ver esta explicación acerca de las diferencias en el comportamiento.

4voto

Gilles Puntos 37591
disCopperBld=
for x; do
  if [ "$x" = "-disCopperBld" ]; then disCopperBld=1; break; fi
done
if [ -n "$disCopperBld" ]; then
  ...
fi

Si usted necesita solamente la prueba de los parámetros de partida en $3, hacer la búsqueda en una función:

## Usage: search_trailing_parameters NEEDLE NUM "$@"
## Search NEEDLE amongst the parameters, skipping $1 through ${$NUM}.
search_trailing_parameters () {
  needle=$1
  shift $(($2 + 2))
  for x; do
    if [ "$x" = "$needle" ]; then return 0; fi
  done
  return 1
}
if search_trailing_parameters -disCopperBld 2 "$@"; then
  ...
fi

Pero me pregunto ¿por qué estás tratando de hacer esto en primer lugar, no es una necesidad común. Normalmente, usted tendría opciones de proceso en orden, como en Dennis, la respuesta a tu pregunta anterior.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: