web-dev-qa-db-fra.com

Vérifier si l'un des paramètres d'un script bash correspond à une chaîne

J'essaie d'écrire un script dans lequel je veux vérifier si l'un des paramètres transmis à un script bash correspond à une chaîne. La façon dont je l'ai configuré en ce moment est

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

mais il pourrait y avoir un grand nombre de paramètres, alors je me demandais s'il y avait une meilleure façon de faire cela?

Merci

EDIT: J'ai essayé cette partie de code et appelé le script avec l'option -disableVenusBld, mais il affiche toujours "Démarrage de la construction". Est-ce que je fais quelque chose de mal? Merci d'avance!

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
58
iman453

Il semble que vous soyez en train de gérer des options dans un script Shell. Voici l'idiome pour cela:

#! /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

(Il existe quelques conventions pour indenter le ;;, et certains shells vous permettent de donner les options sous la forme (--opt1), afin de faciliter la correspondance entre accolades, mais c'est l'idée de base.)

56
Norman Gray

Cela a fonctionné pour moi. Il fait exactement ce que vous avez demandé et rien de plus (pas d’option de traitement). Que ce soit bon ou mauvais est un exercice pour l'affiche :)

if [[ "$*" == *YOURSTRING* ]]
then
    echo "YES"
else
    echo "NO"
fi

Ceci tire parti de la gestion spéciale des crochets $* et bash super-test [[]].

22
Rich Homolka

Que diriez-vous de chercher (avec des caractères génériques) tout l'espace des paramètres:

if [[ $@ == *'-disableVenusBld'* ]]
then

Edit: Ok, ok, donc ce n'était pas une réponse populaire. Que diriez-vous de celui-ci, c'est parfait !:

if [[ "${@#-disableVenusBld}" = "$@" ]]
then
    echo "Did not find disableVenusBld"
else
    echo "Found disableVenusBld"
fi

Edit2: Ok, ok, peut-être que ce n'est pas parfait ... Pensez que cela ne fonctionne que si -param est au début de la liste et correspondra également à -paramXZY ou -paramABC. Je pense toujours que le problème original peut être résolu très bien avec la manipulation de bash, mais je ne l’ai pas encore fait craquer ici ... - Peux-tu ??

8
Rich
disCopperBld=
for x; do
  if [ "$x" = "-disCopperBld" ]; then disCopperBld=1; break; fi
done
if [ -n "$disCopperBld" ]; then
  ...
fi

Si vous ne devez tester que les paramètres commençant par $3, effectuez la recherche dans une fonction:

## 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

Mais je me demande pourquoi vous essayez de faire cela au départ, ce n'est pas un besoin commun. Habituellement, vous traitez les options dans l'ordre, comme dans la réponse de Dennis à votre question précédente .

2
Gilles