it-swarm-eu.dev

bash affecte la valeur par défaut

$ {paramètre: = Word} Attribuer des valeurs par défaut. Si le paramètre est unset ou null, le développement de Word est affecté à paramètre. La valeur du paramètre est alors substituée. Les paramètres de position et les paramètres spéciaux ne peuvent pas être affectés de cette manière.

Je pensais pouvoir utiliser cette fonctionnalité pour écrire ${LONG_VARIABLE_NAME:=hello} au lieu du plus long LONG_VARIABLE_NAME=${LONG_VARIABLE_NAME:-hello}, mais maintenant, bash essaie également d’exécuter 'hello' et donne une commande introuvable. Un moyen d'éviter cela? Ou devrais-je m'en tenir à ce dernier? Quelqu'un peut-il donner un exemple où l'attribution par défaut est réellement utile?

114
zedoo

Utilisez un colon:

: ${A:=hello}

Les deux points sont une commande nulle qui ne fait rien et ignore ses arguments. Il est intégré à bash, de sorte qu'un nouveau processus n'est pas créé.

180
camh

S'il vous plaît regardez http://www.tldp.org/LDP/abs/html/parameter-substitution.html pour des exemples

${parameter-default}, ${parameter:-default}

Si le paramètre n'est pas défini, utilisez default. Après l'appel, le paramètre n'est toujours pas défini.
Les deux formes sont presque équivalentes. L'extra : ne fait la différence que lorsque le paramètre a été déclaré mais est nul.

unset EGGS
echo 1 ${EGGS-spam}   # 1 spam
echo 2 ${EGGS:-spam}  # 2 spam

EGGS=
echo 3 ${EGGS-spam}   # 3
echo 4 ${EGGS:-spam}  # 4 spam

EGGS=cheese
echo 5 ${EGGS-spam}   # 5 cheese
echo 6 ${EGGS:-spam}  # 6 cheese

${parameter=default}, ${parameter:=default}

Si le paramètre n'est pas défini, définissez la valeur du paramètre sur la valeur par défaut.
Les deux formes presque équivalentes. Le: fait une différence que lorsque le paramètre a été déclaré et est null

# sets variable without needing to reassign
# colons suppress attempting to run the string
unset EGGS
: ${EGGS=spam}
echo 1 $EGGS     # 1 spam
unset EGGS
: ${EGGS:=spam}
echo 2 $EGGS     # 2 spam

EGGS=
: ${EGGS=spam}
echo 3 $EGGS     # 3        (set, but blank -> leaves alone)
EGGS=
: ${EGGS:=spam}
echo 4 $EGGS     # 4 spam

EGGS=cheese
: ${EGGS:=spam}
echo 5 $EGGS     # 5 cheese
EGGS=cheese
: ${EGGS=spam}
echo 6 $EGGS     # 6 cheese

${parameter+alt_value}, ${parameter:+alt_value}

Si le paramètre est défini, utilisez alt_value, sinon utilisez null. Après l'appel, la valeur du paramètre n'a pas changé.
Les deux formes presque équivalentes. Le: fait une différence que lorsque le paramètre a été déclaré et est null

unset EGGS
echo 1 ${EGGS+spam}  # 1
echo 2 ${EGGS:+spam} # 2

EGGS=
echo 3 ${EGGS+spam}  # 3 spam
echo 4 ${EGGS:+spam} # 4

EGGS=cheese
echo 5 ${EGGS+spam}  # 5 spam
echo 6 ${EGGS:+spam} # 6 spam
78
Jonathan L

L'extension du paramètre de valeur par défaut est souvent utile dans les scripts de construction, comme dans l'exemple ci-dessous. Si l'utilisateur appelle simplement le script tel quel, Perl ne sera pas intégré. L'utilisateur doit définir explicitement WITH_Perl à une valeur autre que "no" pour l’intégrer.

$ cat defvar.sh
#!/bin/bash

WITH_Perl=${WITH_Perl:-no}

if [[ "$WITH_Perl" != no ]]; then
    echo "building with Perl"
    # ./configure --enable=Perl
else
    echo "not building with Perl"
    # ./configure
fi

Construire sans Perl

$ ./defvar.sh
not building with Perl

Construire avec Perl

$ WITH_Perl=yes ./defvar.sh
building with Perl
18
SiegeX