On m'a dit que les espaces sont importants dans bash
ou d'autres scripts shell et je ne devrais pas changer l'existence des espaces à moins de savoir ce que je fais. Par "changer l'existence", j'entends soit insérer un espace entre deux caractères non spatiaux, soit supprimer un espace entre deux caractères non spatiaux, par exemple en changeant var="$val"
pour var ="$val"
ou vice versa. Je veux demander
Existe-t-il des cas dans lesquels l'utilisation d'un seul espace ou l'utilisation de plusieurs espaces consécutifs dans un script shell fait une différence? .
(Bien sûr, l'insertion / la suppression d'un espace entre guillemets fait une différence, comme passer de echo "a b"
à echo "a b"
ou vice versa. Je cherche des exemples autres que cet exemple trivial.)
J'ai rencontré cette question, mais celle-ci concerne l'ajout et la suppression d'espaces entre deux caractères non spatiaux pour lesquels je connais de nombreux exemples qui feraient une différence.
Toute aide serait appréciée. Inclure plus de variétés de coquilles si possible.
la source
echo
commande avec autant d'espace entre la commande et l'argument.C'est probablement de la triche, mais ceci:
est différent de cela:
même si les espaces ne sont pas entre guillemets. ;-)
Plus confusément, ceci:
est différent de cela:
même s'ils ont l' air identiques!
la source
Si on ne parle pas le caractère d'espace (
U+0020
), mais tout caractère espaces (U+0020
,\n
,\t
, etc.), un cas particulier viennent à l' esprit: Voici les documents.Ce code (en utilisant des espaces):
Imprime:
Mais ce code (à l'aide d'onglets):
Imprime:
En effet ( comme l'indique POSIX ):
la source
<<-
opérateur. Merci beaucoup.Il a également un effet lors de l'écriture des instructions d'affectation. Comme si je dis que
FOO=xyz
cela va créer une variable d'environnement nomméeFOO
avec valeurxyz
, mais si je sépare les égaux avec un espace, il pensera que j'invoque un programme nomméFOO
avec l'argument=xyz
. Il importe donc quand il s'agit de certaines syntaxes.la source
FOO=xyz
une variable de shell interne mais pas une variable d'environnement. Vous en avez besoinset -a
ouexport FOO=xyz
pour cela (c'est-à-dire en faisant partie de l'environnement des sous-processus non sous-shell).