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 ]
310
demandé sur Amir 2012-02-17 21:32:52

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.

472
répondu Itay Perl 2015-01-31 20:45:53

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
180
répondu Brad Parks 2018-03-29 17:07:30
if [ ! -z $1 ] 
then 
    : # $1 was given
else
    : # $1 was not given
fi
34
répondu Irit Katriel 2012-02-17 18:38:47

Vous pouvez vérifier le nombre d'arguments $#

#!/bin/bash
if [ $# -ge 1 ]
then
    $1
else
    foo
fi
16
répondu Dennis 2014-01-02 23:38:57

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")}
7
répondu hagen 2016-03-28 10:01:22

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.

3
répondu Jesse Glick 2016-06-09 15:21:24

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
1
répondu Garren S 2017-01-06 21:17:59

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 
1
répondu mosh 2017-11-26 14:17:42