Je veux que mon script puisse prendre une entrée optionnelle,
par exemple. actuellement mon script est
#!/bin/bash
somecommand foo
mais j'aimerais bien que:
#!/bin/bash
somecommand [ if $1 exists, $1, else, foo ]
Vous pouvez utiliser la syntaxe par défaut:
somecommand ${1:-foo}
Comme indiqué dans la section Manuel de référence de Bash - 3.5.3 Extension des paramètres du shell [non souligné dans l'original]:
Si le paramètre est non défini ou null , le développement de Word est remplacé. Sinon, la valeur du paramètre est substituée.
Si vous souhaitez uniquement substituer une valeur par défaut si le paramètre est non défini (mais pas s'il est null, par exemple si ce n'est pas une chaîne vide), utilisez plutôt cette syntaxe:
somecommand ${1-foo}
Encore une fois de Manuel de référence Bash - 3.5.3 Extension des paramètres du shell :
L'omission des deux points entraîne un test uniquement pour un paramètre non défini. En d’autres termes, si les deux points sont inclus, l’opérateur vérifie l’existence des deux paramètres et que sa valeur n’est pas nulle; si les deux points sont omis, l'opérateur ne teste que l'existence.
Vous pouvez définir une valeur par défaut pour une variable comme ceci:
#!/usr/bin/env bash
ARG1=${1:-foo}
ARG2=${2:-bar}
ARG3=${3:-1}
ARG4=${4:-$(date)}
echo "$ARG1"
echo "$ARG2"
echo "$ARG3"
echo "$ARG4"
Voici quelques exemples de la façon dont cela fonctionne:
$ ./somecommand.sh
foo
bar
1
Thu Mar 29 10:03:20 ADT 2018
$ ./somecommand.sh ez
ez
bar
1
Thu Mar 29 10:03:40 ADT 2018
$ ./somecommand.sh able was i
able
was
i
Thu Mar 29 10:03:54 ADT 2018
$ ./somecommand.sh "able was i"
able was i
bar
1
Thu Mar 29 10:04:01 ADT 2018
$ ./somecommand.sh "able was i" super
able was i
super
1
Thu Mar 29 10:04:10 ADT 2018
$ ./somecommand.sh "" "super duper"
foo
super duper
1
Thu Mar 29 10:05:04 ADT 2018
$ ./somecommand.sh "" "super duper" hi you
foo
super duper
hi
you
if [ ! -z $1 ]
then
: # $1 was given
else
: # $1 was not given
fi
Vous pouvez vérifier le nombre d'arguments avec $#
#!/bin/bash
if [ $# -ge 1 ]
then
$1
else
foo
fi
n'oubliez pas, si sa variable $ 1 .. $ n vous avez besoin d'écrire dans une variable régulière pour utiliser la substitution
#!/bin/bash
NOW=$1
echo ${NOW:-$(date +"%Y-%m-%d")}
Pour les arguments multiples facultatifs, par analogie avec la commande ls
qui peut prendre un ou plusieurs fichiers ou répertorie par défaut tout le contenu du répertoire en cours:
if [ $# -ge 1 ]
then
files="$@"
else
files=*
fi
for f in $files
do
echo "found $f"
done
Ne fonctionne pas correctement pour les fichiers avec des espaces dans le chemin, hélas. Je n'ai pas encore trouvé comment faire en sorte que cela fonctionne.
Cela autorise une valeur par défaut pour le 1er argument facultatif et préserve plusieurs arguments.
> cat mosh.sh
set -- ${1:-xyz} ${@:2:$#} ; echo $*
> mosh.sh
xyz
> mosh.sh 1 2 3
1 2 3
Il est possible d'utiliser la substitution de variable pour remplacer un argument par une valeur fixe ou une commande (comme date
). Jusqu'à présent, les réponses se sont concentrées sur les valeurs fixes, mais c'est ce que j'avais l'habitude de faire de la date comme argument optionnel:
~$ sh co.sh
2017-01-05
~$ sh co.sh 2017-01-04
2017-01-04
~$ cat co.sh
DAY=${1:-$(date +%F -d "yesterday")}
echo $DAY