Comment écrire un script bash prenant des arguments d’entrée facultatifs?

Je veux que mon script puisse prendre une entrée facultative,

par exemple mon script est actuellement

#!/bin/bash somecommand foo 

mais je voudrais dire:

 #!/bin/bash somecommand [ if $1 exists, $1, else, foo ] 

Vous pouvez utiliser la syntaxe valeur par défaut:

 somecommand ${1:-foo} 

Comme ci-dessus, comme décrit dans le Manuel de référence de Bash – 3.5.3 Extension des parameters de Shell [emphase sur le mien]:

Si le paramètre n’est pas défini ou nul , l’expansion du mot est substituée. Sinon, la valeur du paramètre est substituée.

Si vous souhaitez uniquement remplacer une valeur par défaut si le paramètre est désactivé (mais pas si elle est nulle, par exemple si elle est vide), utilisez plutôt cette syntaxe:

 somecommand ${1-foo} 

Encore une fois à partir du Manuel de référence de Bash – 3.5.3 Extension des parameters de shell :

L’absence de deux points entraîne un test uniquement pour un paramètre non défini. En d’autres termes, si le deux-points est inclus, l’opérateur teste l’existence des deux parameters et sa valeur n’est pas nulle; Si les deux-points sont omis, l’opérateur teste uniquement l’existence.

Vous pouvez définir une valeur par défaut pour une variable comme celle-ci:

somecommand.sh

 #!/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 fonctionnement:

 $ ./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 

s’il vous plaît ne pas oublier, 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 optionnels, par analogie avec la commande ls qui peut prendre un ou plusieurs fichiers ou par défaut tout afficher dans le répertoire courant:

 if [ $# -ge 1 ] then files="$@" else files=* fi for f in $files do echo "found $f" done 

Ne fonctionne pas correctement pour les fichiers comportant des espaces dans le chemin, hélas. Je n’ai pas encore compris comment faire ce travail.

Il est possible d’utiliser une substitution de variable pour substituer une valeur fixe ou une commande (comme la date ) à un argument. Les réponses ont jusqu’ici porté sur des valeurs fixes, mais c’est ce que j’ai utilisé pour faire de la date un 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 

Cela permet la valeur par défaut pour le 1er argument optionnel et préserve plusieurs arguments.

  > cat mosh.sh set -- ${1:-xyz} ${@:2:$#} ; echo $* > mosh.sh xyz > mosh.sh 1 2 3 1 2 3