web-dev-qa-db-fra.com

Comment écrire un script bash qui prend des arguments d'entrée optionnels?

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 ]
396
Abe

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.

602
Itay Perl

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
242
Brad Parks
if [ ! -z $1 ] 
then 
    : # $1 was given
else
    : # $1 was not given
fi
41
Irit Katriel

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

#!/bin/bash
if [ $# -ge 1 ]
then
    $1
else
    foo
fi
19
Dennis

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")}
8
hagen

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.

3
Jesse Glick

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 
2
mosh

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
1
Garren S