J'ai un script bash qui ressemble à ceci:
#!/bin/bash
if [ $1 = "--test" ] || [ $1 = "-t" ]; then
echo "Testing..."
testing="y"
else
testing="n"
echo "Not testing."
fi
Donc, ce que je veux pouvoir faire, c'est non seulement l'exécuter avec ./script --test
ou ./script -t
, mais aussi sans argument (juste ./script
), mais apparemment si je le fais avec le code actuel, la sortie est juste:
./script: line 3: [: =: unary operator expected
./script: line 3: [: =: unary operator expected
Not testing.
Alors, comment puis-je le programmer pour que le faire tourner sans aucun argument fasse juste le else
sans lancer l'erreur? Qu'est-ce que je fais mal?
command-line
bash
scripts
Peter Cordes
la source
la source
Réponses:
La "bonne façon" d'utiliser les options longues dans les scripts shell est via l' utilitaire getopt GNU . Il y a aussi getopts qui est un bash intégré , mais il ne permet que des options courtes comme
-t
. Quelques exemples d'getopt
utilisation sont disponibles ici .Voici un script qui montre comment j'aborderais votre question. L'explication de la plupart des étapes est ajoutée en tant que commentaires dans le script lui-même.
Avec quelques simplifications et commentaires supprimés, cela peut être condensé en:
la source
Plusieurs façons; les deux plus évidents sont:
$1
entre guillemets:if [ "$1" = "--test" ]
Mieux encore, utilisez getopts.
la source
[ "x$1" = "x--test" ]
à défendre à nouveau les arguments de ligne de commande qui sont des opérateurs valides pour la[
commande. (C'est une autre raison pour laquelle il[[ ]]
est préférable: cela fait partie de la syntaxe du shell, pas seulement une commande intégrée.)Vous devez citer vos variables à l'intérieur de la condition if. Remplacer:
avec:
Ensuite, cela fonctionnera:
Citez toujours toujours vos variables!
la source
foo=bar echo '$foo'
imprime$foo
à la sortie, mais desfoo=bar echo "$foo"
impressions aubar
lieu.Vous utilisez bash. Bash a une excellente alternative à
[
:[[
. Avec[[
, vous n'avez pas à vous soucier de la cotation, et vous obtenez beaucoup plus d'opérateurs que[
, y compris un support approprié pour||
:Ou vous pouvez utiliser des expressions régulières:
Bien sûr, des citations appropriées doivent toujours être faites, mais il n'y a aucune raison de s'en tenir à l'
[
utilisation de bash.la source
Pour tester si des arguments sont présents (en général, et effectuez les actions en conséquence) Cela devrait fonctionner:
la source
[ -z "$1" ]
?$check
une fois, avant toutshift
s, il serait donc préférable de l'utiliser à la$1
place.#!
lors de la fourniture d'échantillons (vous devez décrire le shell en dehors du code).