Comment écrire un script bash qui prend des arguments d'entrée optionnels?
Je veux que mon script puisse prendre une entrée facultative,
Par exemple, actuellement mon script est
#!/bin/bash
somecommand foo
Mais je voudrais dire:
#!/bin/bash
somecommand [ if $1 exists, $1, else, foo ]
8 réponses
Vous pouvez utiliser la syntaxe valeur par défaut:
somecommand ${1:-foo}
Ci-dessus sera, comme décrit dans Bash Manuel de Référence - 3.5.3 Shell Paramètre d'Extension [c'est moi qui souligne]:
Si le paramètre est unset ou null , l'expansion du mot est substituée. Sinon, la valeur du paramètre est substituée.
Si vous voulez seulement substituer une valeur par défaut si le paramètre n'est pas défini (mais pas s'il est null, par exemple pas s'il s'agit d'une chaîne vide), utilisez cette syntaxe au lieu de cela:
somecommand ${1-foo}
Encore une fois à partir de Bash Manuel de référence - 3.5.3 Shell paramètre Expansion :
L'omission des deux-points entraîne un test uniquement pour un paramètre non défini. Autrement dit, si le deux-points est inclus, l'opérateur teste l'existence des deux paramètres et que sa valeur n'est pas nulle; si le deux-points est omis, l'opérateur ne teste que l'existence.
Vous pouvez définir une valeur par défaut pour une variable comme ceci:
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 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 $#
#!/bin/bash
if [ $# -ge 1 ]
then
$1
else
foo
fi
N'oubliez pas, si sa variable $1 .. $et vous devez écrire dans une variable régulière pour utiliser la substitution
#!/bin/bash
NOW=$1
echo ${NOW:-$(date +"%Y-%m-%d")}
Pour les arguments optionnels multiples, par analogie avec la commande ls
qui peut prendre un ou plusieurs fichiers ou répertorie par défaut tout ce qui se trouve 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 avec des espaces dans le chemin, hélas. N'ai pas compris comment le faire fonctionner.
Il est possible d'utiliser la substitution de variable pour remplacer une valeur fixe ou une commande (comme date
) par un argument. Les réponses jusqu'à présent se sont concentrées sur des valeurs fixes, mais c'est ce que j'avais l'habitude de faire de 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 arg optionnel, et préserve plusieurs args.
> cat mosh.sh
set -- ${1:-xyz} ${@:2:$#} ; echo $*
> mosh.sh
xyz
> mosh.sh 1 2 3
1 2 3