J'aimerais que mon script Bash imprime un message d'erreur si le nombre d'arguments requis n'est pas atteint.
J'ai essayé le code suivant:
#!/bin/bash
echo Script name: $0
echo $# arguments
if [$# -ne 1];
then echo "illegal number of parameters"
fi
Pour une raison inconnue, j'ai l'erreur suivante:
test: line 4: [2: command not found
Qu'est-ce que je fais mal?
Comme toute autre commande simple, [ ... ]
ou test
nécessite des espaces entre ses arguments.
if [ "$#" -ne 1 ]; then
echo "Illegal number of parameters"
fi
Ou
if test "$#" -ne 1; then
echo "Illegal number of parameters"
fi
Quand vous êtes dans Bash, préférez utiliser [[ ]]
à la place, car le fractionnement de Word et le développement du chemin d'accès à ses variables ne sont pas nécessairement complétés par des guillemets, sauf si cela fait partie d'une expression.
[[ $# -ne 1 ]]
Il possède également d'autres fonctionnalités telles que le groupement de conditions non entre guillemets, la correspondance de modèle (correspondance de modèle étendue avec extglob
) et la correspondance de regex.
L'exemple suivant vérifie si les arguments sont valides. Cela permet un seul argument ou deux.
[[ ($# -eq 1 || ($# -eq 2 && $2 == <glob pattern>)) && $1 =~ <regex pattern> ]]
Pour les expressions arithmétiques pures, utiliser (( ))
avec certaines peut être encore meilleur, mais elles sont toujours possibles dans [[ ]]
avec ses opérateurs arithmétiques comme -eq
, -ne
, -lt
, -le
, -gt
ou -ge
en plaçant l'expression sous la forme d'un argument de chaîne unique:
A=1
[[ 'A + 1' -eq 2 ]] && echo true ## Prints true.
Cela devrait être utile si vous devez également le combiner avec d’autres fonctionnalités de [[ ]]
.
Ce pourrait être une bonne idée d'utiliser expressions arithmétiques si vous avez affaire à des nombres.
if (( $# != 1 )); then
echo "Illegal number of parameters"
fi
Sur []:! =, =, == ... sont string les opérateurs de comparaison et -eq, -gt ... sont arithmétiques binaires.
J'utiliserais:
if [ "$#" != "1" ]; then
Ou:
if [ $# -eq 1 ]; then
Si vous voulez seulement perdre un argument particulier, Parameter Substitution is great
#!/bin/bash
# usage-message.sh
: ${1?"Usage: $0 ARGUMENT"}
# Script exits here if command-line parameter absent,
#+ with following error message.
# usage-message.sh: 1: Usage: usage-message.sh ARGUMENT
Une simple doublure qui fonctionne peut être réalisée en utilisant:
[ "$#" -ne 1 ] && ( usage && exit 1 ) || main
Cela se résume à:
Pense à noter:
Découvrez this bash cheatsheet, cela peut aider beaucoup.
Pour vérifier la longueur des arguments transmis, utilisez "$#"
.
Pour utiliser le tableau d'arguments transmis, utilisez "$@"
.
Voici un exemple de vérification de la longueur et d’itération:
myFunc() {
if [[ "$#" -gt 0 ]]; then
for arg in "$@"; do
echo $arg
done
fi
}
myFunc "$@"
Ce stage m'a aidé, mais il me manquait quelques petites choses pour moi et ma situation. Espérons que cela aide quelqu'un.
Si vous voulez être prudent, je vous recommande d’utiliser getopts.
Voici un petit exemple:
while getopts "x:c" opt; do
case $opt in
c)
echo "-$opt was triggered, deploy to ci account" >&2
DEPLOY_CI_ACCT="true"
;;
x)
echo "-$opt was triggered, Parameter: $OPTARG" >&2
CMD_TO_EXEC=${OPTARG}
;;
\?)
echo "Invalid option: -$OPTARG" >&2
Usage
exit 1
;;
:)
echo "Option -$OPTARG requires an argument." >&2
Usage
exit 1
;;
esac
done
voir plus de détails ici par exemple http://wiki.bash-hackers.org/howto/getopts_tutorial
Vous devez ajouter des espaces entre les conditions de test:
if [ $# -ne 1 ];
then echo "illegal number of parameters"
fi
J'espère que ça aide.
Voici un simple liners pour vérifier si un seul paramètre est donné, sinon quittez le script:
[ "$#" -ne 1 ] && echo "USAGE $0 <PARAMETER>" && exit