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
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.)
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 [[
… ]]
.
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 ??
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 .