Je veux que mon script puisse prendre une entrée facultative,
par exemple, actuellement mon script est
#!/bin/bash
somecommand foo
mais je voudrais qu'il dise:
#!/bin/bash
somecommand [ if $1 exists, $1, else, foo ]
Je veux que mon script puisse prendre une entrée facultative,
par exemple, actuellement mon script est
#!/bin/bash
somecommand foo
mais je voudrais qu'il dise:
#!/bin/bash
somecommand [ if $1 exists, $1, else, foo ]
Réponses:
Vous pouvez utiliser la syntaxe de valeur par défaut:
somecommand ${1:-foo}
Comme décrit dans le Manuel de référence Bash - 3.5.3 Expansion des paramètres du shell [accentuation], les éléments ci-dessus :
Si le paramètre est non défini ou nul , l'expansion du mot est substituée. Sinon, la valeur du paramètre est substituée.
Si vous ne souhaitez remplacer une valeur par défaut que si le paramètre n'est pas défini (mais pas s'il est nul, par exemple pas s'il s'agit d'une chaîne vide), utilisez plutôt cette syntaxe:
somecommand ${1-foo}
Encore une fois dans le manuel de référence Bash - 3.5.3 Expansion des paramètres du shell :
L'omission des deux points entraîne un test uniquement pour un paramètre non défini. Autrement dit, si le signe deux-points est inclus, l'opérateur teste l'existence des deux paramètres et leur valeur n'est pas nulle; si le signe deux-points est omis, l'opérateur teste uniquement l'existence.
foo
if $1
is unset or a empty string ", and ${1-foo}
, "return foo
if $1
is unset".
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 comment 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
-
m'a confondu (est-ce nié?).
if [ ! -z $1 ]
then
: # $1 was given
else
: # $1 was not given
fi
-n
est le même que ! -z
.
-n
et ! -z
donc je dirais que ce n'est pas le cas ici.
[ -n $1 ]
sera toujours vrai . Si vous utilisez bash, [[ -n $1 ]]
se comportera comme prévu, sinon vous devez citer[ -n "$1" ]
n'oubliez pas, si sa variable $ 1 .. $ n vous devez écrire dans une variable régulière pour utiliser la substitution
#!/bin/bash
NOW=$1
echo ${NOW:-$(date +"%Y-%m-%d")}
DAY=${1:-$(date +%F -d "yesterday")}
Pour les arguments multiples optionnels , par analogie avec la ls
commande qui peut prendre un ou plusieurs fichiers ou par défaut liste tout dans le répertoire courant:
if [ $# -ge 1 ]
then
files="$@"
else
files=*
fi
for f in $files
do
echo "found $f"
done
Hélas, ne fonctionne pas correctement pour les fichiers avec des espaces dans le chemin. Je n'ai pas encore trouvé comment faire fonctionner cela.
Il est possible d'utiliser la substitution de variable pour substituer une valeur fixe ou une commande (comme date
) à un argument. Jusqu'à présent, les réponses se sont concentrées sur des valeurs fixes, mais c'est ce que j'ai utilisé pour faire de la date un argument facultatif:
~$ 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