web-dev-qa-db-fra.com

Bash: comment définir une variable à partir d'un argument et avec une valeur par défaut

Il est assez clair qu'avec les scripts Shell, ce genre de choses peut être accompli de nombreuses façons (plus que la plupart des langages de programmation) en raison de toutes les différentes méthodes et programmes d'extension de variables comme test et [ et [[, etc.

En ce moment je cherche juste

DIR=$1 or .

Cela signifie que ma variable DIR doit contenir ce qui est spécifié dans le premier argument ou le répertoire courant.

Quelle est la différence entre ceci et DIR=${1-.}?

Je trouve la syntaxe des tirets déroutante et je recherche une syntaxe plus lisible.

Pourquoi je ne peux pas faire ça?

DIR="$1" || '.'

Je suppose que cela signifie "si $ 1 est vide, l'affectation fonctionne toujours (DIR devient vide), donc la commande invalide '.' n'est jamais exécuté. "

29
Steven Lu

Je vois plusieurs questions ici.

  1. "Puis-je écrire quelque chose qui reflète réellement cette logique"

    Oui. Il existe plusieurs façons de procéder. En voici un:

    if [[ "$1" != "" ]]; then
        DIR="$1"
    else
        DIR=.
    fi
    
  2. "Quelle est la différence entre cela et DIR=${1-.}? "

    La syntaxe ${1-.} se développe en . si $1 n'est pas défini, mais se développe comme $1 si $1 est défini — même si $1 est défini sur la chaîne vide.

    La syntaxe ${1:-.} se développe en . si $1 n'est pas défini ou est défini sur la chaîne vide. Il se développe comme $1 seulement si $1 est défini sur autre chose que la chaîne vide.

  3. "Pourquoi je ne peux pas faire ça? DIR="$1" || '.'

    Parce que c'est bash, pas Perl ou Ruby ou un autre langage. (Pardonnez ma snideness.)

    En bash, || sépare des commandes entières (techniquement, il sépare les pipelines). Il ne sépare pas les expressions.

    Alors DIR="$1" || '.' signifie "exécuter DIR="$1", et si cela se termine avec un code de sortie différent de zéro, exécutez '.' ”.

55
rob mayoff

Que dis-tu de ça:

DIR=.
if [ $# -gt 0 ]; then
  DIR=$1
fi

$# est le nombre d'arguments donnés au script, et -gt signifie "supérieur à", donc vous définissez essentiellement DIR à la valeur par défaut, et si l'utilisateur a spécifié un argument, vous définissez DIR à la place.

4
Vaughn Cato

J'utilise une fonction d'assistance simple pour rendre ces affectations plus propres. La fonction ci-dessous accepte n'importe quel nombre d'arguments, mais renvoie le premier qui n'est pas la chaîne vide.

default_value() {
    # Return the first non-empty argument
    while [[ "$1" == "" ]] && [[ "$#" -gt "0" ]]; do
        shift
    done
    echo $1
}
x=$(default_value "$1" 0)
0
icosabit