2010-01-06 7 views
357

J'ai tout un tas de tests sur les variables dans un script shell bash (3.00) où si la variable n'est pas définie, elle affecte une valeur par défaut, par exemple:Affectation de valeurs par défaut aux variables shell avec une seule commande dans bash

if [ -z "${VARIABLE}" ]; then 
    FOO='default' 
else 
    FOO=${VARIABLE} 
fi 

me semble me rappeler qu'il ya une certaine syntaxe pour faire cela en une ligne, quelque chose qui ressemble à un opérateur ternaire, par exemple:

FOO=${ ${VARIABLE} : 'default' } 

(si je sais ça ne marchera pas ...)

Suis-je fou, ou est-ce que quelque chose comme ça existe?

+1

section d'extension des paramètres Shell de la référence shell bash est un bon endroit de départ: https://tiswww.case.edu/php/chet/ bash/bashref.html # Shell-Expansions. –

Répondre

618

Très proche de ce que vous avez publié, en fait:

FOO=${VARIABLE:-default} # If variable not set, use default. 

Ou, qui assignera default-VARIABLE ainsi:

FOO=${VARIABLE:=default} # If variable not set, set it to default. 
+24

Si je voulais trouver cela dans la documentation, qu'est-ce qu'un google pour? Googling avec des caractères spéciaux comme $ {: -} n'est pas très facile. –

+14

En réponse à solarmist: "Bash variable affectation par défaut" laissez-moi à cette page, et la recherche de bash's manuel de la page avec 'variable ass' m'a obtenu à la section droite après ~ cinq 'next' – Mooshu

+29

Notez que c'est [* not * bash- spécifique] (http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_06_02) et fonctionnera avec toute la famille shell. C'est sans danger pour les scripts génériques. –

161

Pour les arguments de ligne de commande:

VARIABLE=${1:-DEFAULTVALUE}  

qui attribue à VARIABLE la valeur du 1er argument passé au script ou la valeur de DEFAULTVALUE si aucun argument a été passé.

21

voir here sous 3.5.3 (extension des paramètres shell)

donc dans votre cas

${VARIABLE:−default} 
11

Ensuite, il y a la façon d'exprimer votre « si » construire plus laconique:

FOO='default' 
[ -n "${VARIABLE}" ] && FOO=${VARIABLE} 
+3

cela est bon pour la compatibilité x avec les shells plus tôt –

16

vous pouvez même utiliser comme valeur par défaut la valeur d'une autre variable

ayant un fichier defvalue.sh

#!/bin/bash 
variable1=$1 
variable2=${2:-$variable1} 

echo $variable1 
echo $variable2 

exécution ./defvalue.sh first-value second-value sortie

first-value 
second-value 

et exécuter ./defvalue.sh first-value sortie

first-value 
first-value 
+0

Merci de montrer un exemple avec $ 1, $ 2 ... –

119

Si la variable est la même, alors

: "${VARIABLE:=DEFAULT_VALUE}" 

attribue DEFAULT_VALUE à VARIABLE si non défini. Les guillemets doubles empêchent la globalisation et la division des mots. Voir aussi Section 3.5.3, Shell Parameter Expansion, dans le manuel de Bash.

+4

Je viens de me retrouver en référence à cela encore, et encore, et encore !!! – chnrxn

+12

Cette astuce n'était pas évidente pour moi, en utilisant le: sans effet intégré pour manger l'expansion de l'ensemble $ {..} MAIS VARIABLE. Jusqu'à présent je faisais ceci: VARIABLE = "$ {VARIABLE: -DEFAULT_VALUE}" et se sentant dorky pour utiliser VARIABLE deux fois. – dino

+0

Il s'avère que CECI NE FONCTIONNE TOUJOURS PAS POUR LES VARIABLES BASH-BUILTIN. C'est très très bizarre. Actuellement, ceux qui me sont connus sont 'HISTTIMEFORMAT' – Otheus

7

Voici un exemple

#!/bin/bash 

default='default_value' 
value=${1:-$default} 

echo "value: [$value]" 

enregistrer comme script.sh et le rendre exécutable. exécuter sans params

./script.sh 
> value: [default_value] 

course avec param

./script.sh my_value 
> value: [my_value] 
10

FWIW, vous pouvez fournir un message d'erreur comme ceci:

USERNAME=${1:?"Specify a username"} 

Cette affiche un message comme celui-ci et se termine avec code 1:

./myscript.sh 
./myscript.sh: line 2: 1: Specify a username 

Un exemple plus complet de tout:

#!/bin/bash 
ACTION=${1:?"Specify 'action' as argv[1]"} 
DIRNAME=${2:-$PWD} 
OUTPUT_DIR=${3:-${HOMEDIR:-"/tmp"}} 

echo "$ACTION" 
echo "$DIRNAME" 
echo "$OUTPUT_DIR" 

Sortie:

$ ./script.sh foo 
foo 
/path/to/pwd 
/tmp 

$ export HOMEDIR=/home/myuser 
$ ./script.sh foo 
foo 
/path/to/pwd 
/home/myuser 
  • $ACTION prend la valeur du premier argument, et sort si elle est vide
  • $DIRNAME est le 2ème argument et par défaut pour le répertoire en cours
  • est le 3ème argument, ou $HOMEDIR (si défini), sinon, /tmp. Cela fonctionne sur OS X, mais je ne suis pas sûr que ce soit portable.
1

Pour répondre à votre question et sur toutes les substitutions variables

echo "$\{var}" 
echo "Substitute the value of var." 


echo "$\{var:-word}" 
echo "If var is null or unset, word is substituted for var. The value of var does not change." 


echo "2- $\{var:=word}" 
echo "If var is null or unset, var is set to the value of word." 


echo "$\{var:?message}" 
echo "If var is null or unset, message is printed to standard error. This checks that variables are set correctly." 


echo "$\{var:+word}" 
echo "If var is set, word is substituted for var. The value of var does not change." 
Questions connexes