But du colon en expansion variable

Sep 24 2020

J'examine un ancien script shell. Je ne peux pas comprendre deux choses.

rm /data/log || true

value=$(cat /datafile) if [ ${value: -1} ==  0 ] 
 then echo 'do'
else echo 'dont'
 fi
  1. value: -1 - Qu'est-ce que ça fait réellement?
  2. rm /data/log || true- Qu'est-ce que ça ||truefait?

Réponses

3 LjmDullaart Sep 24 2020 at 07:09

rm /data/log || trueest seulement (dans mon humble expérience) utile si le script est exécuté avec set -e. set -efait sortir le shell lorsqu'une commande se termine avec un état d'erreur. Le créateur du script n'était apparemment pas au courant du -fdrapeau pour rm.

${value: -1}est probablement une faute de frappe. Cela devrait être ${value:-1}, en fournissant la valeur par défaut (1, pas -1; cela -fait partie de la :-syntaxe) pour l'expansion de variable si elle valueest nulle ou non définie.

Si cela devrait vraiment être le cas ${value: -1}, voyez la réponse de Glenn Jackman pour la signification réelle.

7 glennjackman Sep 24 2020 at 16:27

${value: -1}se développe jusqu'au dernier caractère du contenu de la variable.

${value:-1}est différent de ${value: -1}!

En se référant à l' extension des paramètres du shell dans le manuel:

  1. ${value:-1}se développe au contenu de la valuevariable, ou si la variable n'est pas définie ou vide, à la chaîne "1"

  2. ${value: -1}est une forme abrégée du ${var:offset:length}formulaire pour extraire une sous-chaîne du contenu variable. Un décalage de -1signifie "un caractère à partir de la fin de la chaîne". La :lengthpartie est manquante, donc la sous-chaîne est prise de la offsetà la fin de la chaîne.

    Le manuel dit:

    Notez qu'un décalage négatif doit être séparé des deux points par au moins un espace pour éviter d'être confondu avec le développement ': -'.

Henriksupportsthecommunity Sep 24 2020 at 07:02

À partir de bash (1): $ {paramètre: -word} Utilisez les valeurs par défaut. Si le paramètre n'est pas défini ou nul, le développement du mot est remplacé. Sinon, la valeur du paramètre est remplacée.

|| trues'assure que la commande renvoie vrai. ||est un opérateur OR de court-circuit, si la commande en face retourne false, la commande après son exécution et la valeur de retour utilisée.