Comment utiliser une variable d'environnement dans une chaîne entre guillemets dans Bash

StackOverflow https://stackoverflow.com/questions/840536

  •  20-08-2019
  •  | 
  •  

Question

J'ai essayé différentes formes de ce qui suit dans un script bash:

#!/bin/bash
svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"

Mais je ne parviens pas à obtenir la syntaxe permettant de développer correctement la variable d'environnement COLUMNS .

J'ai essayé différentes formes de ce qui suit:

svn diff $@ --diff-cmd /usr/bin/diff -x '-y -w -p -W $COLUMNS'

et

svn diff $@ --diff-cmd /usr/bin/diff -x '-y -w -p -W ${COLUMNS}'

et

eval svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"

Des suggestions?

Était-ce utile?

La solution

En cas de doute, vous pouvez utiliser la requête 'cols' sur le terminal et oublier COLUMNS:

COLS=$(tput cols)

Autres conseils

Juste un petit mot / résumé pour tous ceux qui sont venus ici via Google à la recherche de la réponse à la question générale posée dans le titre (comme j'étais). N'importe lequel des éléments suivants devrait permettre d'accéder aux variables du shell entre guillemets:

echo "$VARIABLE"
echo "${VARIABLE}"

L'utilisation de guillemets simples est le problème principal. Selon le Manuel de référence de Bash :

  

Le fait de placer des caractères entre guillemets simples ( ') préserve la valeur littérale de chaque caractère entre guillemets. Un seul guillemet ne peut pas apparaître entre guillemets, même s'il est précédé d'une barre oblique inverse.   [...]   Les caractères entre guillemets ( " ) préservent la valeur littérale de tous les caractères compris entre guillemets, à l'exception de $ , `, < code> \ et, lorsque le développement de l'historique est activé, ! . Les caractères $ et `conservent leur signification particulière entre guillemets (voir Extension du shell). La barre oblique inverse ne conserve sa signification particulière que si elle est suivie de l’un des caractères suivants: $ , `, " , \ ou nouvelle ligne. Dans les guillemets doubles, les barres obliques inverses suivies de l'un de ces caractères sont supprimées. Les barres obliques inverses précédant les caractères sans signification particulière ne sont pas modifiées. Une citation double peut être citée entre guillemets en la faisant précéder d'une barre oblique inverse. Si cette option est activée, l’extension de l’historique sera réalisée à moins qu’un caractère ! entre guillemets doubles ne soit échappé à l’aide d’une barre oblique inverse. La barre oblique inverse précédant ! n'est pas supprimée.   Les paramètres spéciaux * et @ ont une signification particulière entre guillemets (voir Extension des paramètres de coque).

Dans le cas spécifique posé dans la question, $ COLUMNS est une variable spéciale ayant des propriétés non standard (voir la réponse de lhunath ci-dessus).

Notez que COLUMNS est:

  1. NOT une variable d'environnement. C'est un paramètre bash ordinaire défini par bash lui-même.
  2. Défini automatiquement à la réception d'un signal SIGWINCH .

Ce deuxième point signifie généralement que votre variable COLUMNS ne sera définie que dans votre shell interactif , pas dans un script bash.

Si le stdin de votre script est connecté à votre terminal, vous pouvez rechercher manuellement la largeur de votre terminal en demandant à votre terminal:

tput cols

Et pour utiliser ceci dans votre commande SVN:

svn diff "$@" --diff-cmd /usr/bin/diff -x "-y -w -p -W $(tput cols)"

(Remarque: vous devez citer "$ @" et rester à l'écart de eval ; -))

Le script suivant fonctionne pour moi avec plusieurs valeurs de $ COLUMNS . Je me demande si vous ne définissez pas COLUMNS avant cet appel?

#!/bin/bash
COLUMNS=30
svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"

Pouvez-vous consulter $ COLUMNS dans votre script pour voir s'il est correctement défini?

Vous le faites bien, alors je suppose que quelque chose d'autre est en cause (vous n'exportez pas COLUMNS?).

Une astuce pour déboguer ces cas est de faire une commande spécialisée (une fermeture pour les gars du langage de programmation). Créez un script shell nommé diff-columns en faisant:

exec /usr/bin/diff -x -y -w -p -W "$COLUMNS" "$@"

et utilisez simplement

svn diff "$@" --diff-cmd  diff-columns

De cette manière, votre code est plus propre à la lecture et plus modulaire (approche top-down), et vous pouvez tester le code diff-columns séparément (approche bottom-up).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top