118 votes

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

J'essaie d'écrire un script où je veux vérifier si l'un des paramètres passés à un script bash correspond à une chaîne de caractères. 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 comme il peut y avoir un grand nombre de paramètres, je me demandais s'il y avait une meilleure façon de procéder ?

Merci

EDIT : J'ai essayé ce morceau de code, et j'ai appelé le script avec l'option, -disableVenusBld, mais il affiche toujours "Starting build". 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

93voto

Norman Gray Points 1206

On dirait que vous faites la gestion des options dans un Shell 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 plusieurs conventions pour l'indentation de l'écran. ;; et certains shells vous permettent de donner les options sous forme de (--opt1) (pour aider à faire correspondre les accolades, mais c'est l'idée de base).

88voto

Lark Points 1640

Cela a marché pour moi. Il fait exactement ce que vous avez demandé et rien de plus (pas de traitement des options). Que ce soit bien ou mal, c'est un exercice pour le posteur :)

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

Cela permet de tirer parti d'une gestion spéciale des $* et bash super-test [[ ]] des crochets.

10voto

Rich Points 223

Pourquoi ne pas effectuer une recherche (avec des caractères génériques) dans l'ensemble de l'espace des paramètres ?

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

Edit : Ok, ok, donc ce n'était pas une réponse populaire. Que pensez-vous de celle-ci, elle est parfaite !

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

Edit2 : Ok, ok, peut-être que ce n'est pas parfait... Je pense 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 de façon très agréable avec la manipulation des chaînes de caractères en bash, mais je n'ai pas tout à fait trouvé la solution ici... -Et vous ?

7voto

user1016765 Points 149
[[ "$@" =~ '-disableVenusBld' ]] && disableVenusBld=true
[[ "$@" =~ '-disCopperBld' ]] && disCopperBld=true
[[ "$@" =~ '-disableTest' ]] && disableTest=true
[[ "$@" =~ '-disableUpdate' ]] && disableUpdate=true

ou plus généralement

[[ "$@" =~ 'your-string' ]] && ( doSomething )

5voto

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

Si vous avez besoin de tester uniquement les paramètres commençant à $3 faire 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 ça en premier lieu, ce n'est pas un besoin courant. Habituellement, vous traitez les options dans l'ordre, comme dans la réponse de Dennis à votre question précédente .

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X