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é. "
Je vois plusieurs questions ici.
"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
"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.
"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 '.'
”.
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.
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)