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
linux
unix
bash
shell-script
iman453
la source
la source
#! /bin/sh -
en haut de ce que vous avez inclus ici, rendu le script exécutable, puis./t.sh
imprimé "Démarrage de la construction", mais./t.sh -disableVenusBld
n'imprime rien.Réponses:
Il semble que vous soyez en train de gérer des options dans un script shell. Voici l'idiome pour cela:
(Il existe quelques conventions pour indenter le
;;
, et certains shells vous permettent de donner les options comme(--opt1)
, pour aider à la correspondance d'accolade, mais c'est l'idée de base)la source
shift
instruction est utilisée lorsque le nombre d'arguments d'une commande n'est pas connu à l'avance, par exemple lorsque les utilisateurs peuvent donner autant d'arguments qu'ils le souhaitent. Dans ce cas, les arguments sont traités dans unewhile
boucle avec une condition de test de$#
. Cette condition est vraie tant que le nombre d'arguments est supérieur à zéro. La$1
variable et l'shift
instruction traitent chaque argument. Le nombre d'arguments est réduit à chaqueshift
exécution et atteint finalement zéro, après quoi lawhile
boucle se termine. sourceecho $1 | sed
traitement de valeur d'argument supplémentaire .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 :)
Cela tire parti de la manipulation spéciale des supports
$*
et du super-test[[
… bash]]
.la source
$*
en$@
, car la chaîne à tester peut comporter des espaces et un lien vers la documentation de bash à ce sujet.bash -c 'echo args=$*; [[ "$@" == "bar" ]] && echo YES || echo NO' -- foo bar
your string
. Je pense que vous devez faire ce qui est suggéré par cette réponse . c'est-à-dire:bash -c 'echo args=$*; for i in "$@" ; do [[ $i == "bar" ]] && echo "Is set!" && break ; done' -- bar foo
fonctionnerait.create a new certificate
et que «votre chaîne» l'estcat
, cela indiquera une correspondance carcertificate
contientcat
.Que diriez-vous de chercher (avec des caractères génériques) tout l'espace des paramètres:
Edit: Ok, ok, donc ce n'était pas une réponse populaire. Que diriez-vous de celui-ci, c'est parfait !:
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 ??
la source
${@#
)?$@
cette variable spéciale contient tous les arguments de la ligne de commande? Eh bien, je viens d'utiliser la manipulation de chaîne Bash sur cette variable pour supprimer la sous-chaîne "-disableVenusBld", puis je la compare à l'original$@
. Donc, si$@
égaux,-foo -bar
ils le${@#-disableVenusBld}
seraient toujours-foo -bar
, alors je peux voir que le drapeau que je cherche n'est pas présent. Cependant, si$@
égaux,-foo -disableVenusBld -bar
alors${@#-disableVenusBld}
ce-foo -bar
qui n'est pas égal$@
, me dit donc que le drapeau que je cherche est présent! Cool hein!Si vous ne devez tester que les paramètres à partir de
$3
, effectuez la recherche dans une fonction: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 .
la source