Si l'exemple suivant, qui définit la IFS
variable d'environnement sur un caractère de saut de ligne ...
IFS=$'\n'
- Que signifie exactement le signe dollar ?
- Que fait-il dans ce cas précis?
- Où puis-je en savoir plus sur cette utilisation spécifique (Google n'autorise pas les caractères spéciaux dans les recherches et je ne sais pas quoi chercher autrement)?
Je sais ce qu'est la IFS
variable d'environnement et quel est le \n
caractère (saut de ligne), mais pourquoi ne pas simplement utiliser le formulaire suivant:
IFS="\n"
(qui ne fonctionne pas)?
Par exemple, si je veux parcourir chaque ligne d'un fichier et que je veux utiliser une boucle for, je pourrais le faire:
for line in (< /path/to/file); do
echo "Line: $line"
done
Cependant, cela ne fonctionnera pas correctement à moins qu'il ne IFS
soit défini sur un caractère de saut de ligne. Pour que cela fonctionne, je devrais faire ceci:
OLDIFS=$IFS
IFS=$'\n'
for line in (< /path/to/file); do
echo "Line: $line"
done
IFS=$OLDIFS
Note: je n'ai pas besoin d'un autre moyen pour faire la même chose, j'en connais déjà beaucoup d'autres ... Je ne suis curieux que de ça $'\n'
et je me demande si quelqu'un pourrait me donner une explication à ce sujet.
\n
est juste une lettre n (échappée). Vous avez raison'\n'
et vous"\n"
êtes contrecarré suivi de n.$'\n'
est spécifique à bash - cela ne fonctionnera pas dans un shell POSIX (/bin/sh
). Pour obtenir le même effet d'une manière compatible POSIX, vous pouvez taperIFS='
, puis appuyer sur retour pour taper un caractère de nouvelle ligne réel, puis taper la fermeture'
IFS=$(echo -e '\n')
devrait également le faire d'une manière compatible POSIX.-e
n'est pas défini, et\n
sans-e
fonctionne comme une extension XSI: pubs.opengroup.org/onlinepubs/9699919799/utilities/… .printf '\n'
roches;)Juste pour donner à la construction son nom officiel : les chaînes du formulaire
$'...'
sont appelées chaînes entre guillemets C ANSI .Autrement dit, comme dans les chaînes [ANSI] C, les séquences d'échappement de backlash sont reconnues et étendues à leur équivalent littéral (voir ci-dessous pour la liste complète des séquences d'échappement prises en charge).
Après cette expansion, les
$'...'
chaînes se comportent de la même manière que les'...'
chaînes - c'est-à-dire qu'elles sont traitées comme des littéraux NON soumis à d'autres extensions de shell .Par exemple, se
$'\n'
développe en un caractère de nouvelle ligne littéral - ce qui est quelque chose qu'un littéral de chaîne bash ordinaire (que ce soit'...'
ou"..."
) ne peut pas faire. [1]Une autre caractéristique intéressante est que les chaînes ANSI entre guillemets C peuvent s'échapper
'
(guillemets simples) comme\'
, ce qui,'...'
(chaînes régulières entre guillemets simples) ne peut pas:Liste des séquences d'échappement prises en charge :
[1] Vous pouvez, cependant, incorporer des nouvelles lignes réelles dans les chaînes '...' et "..."; c'est-à-dire que vous pouvez définir des chaînes qui s'étendent sur plusieurs lignes.
la source
De http://www.linuxtopia.org/online_books/bash_guide_for_beginners/sect_03_03.html :
Je suppose que cela force le script à échapper au saut de ligne selon la norme ANSI-C appropriée.
la source
Récupération de l'IFS par défaut - ce
OLDIFS=$IFS
n'est pas nécessaire. Exécutez un nouvel IFS dans le sous-shell pour éviter de remplacer l'IFS par défaut:De plus, je ne crois pas vraiment que vous récupériez complètement l'ancien IFS. Vous devez le double guillemet pour éviter les sauts de ligne tels que
OLDIFS="$IFS"
.la source
args=$(IFS='&'; echo "$*")
. restaurerIFS
d'$' \t\n'
une manière conviviale Bourne shell n'est pas une mince affaire.Besides I don't really believe you recover the old IFS fully
: le fractionnement de mots n'est pas effectué sur le RHS des affectations de variables (mais la suppression des guillemets l'est), doncOLDIFS=$IFS
etOLDIFS="$IFS"
se comporte de la même manière.Les chaînes entre guillemets C ANSI sont un point clé. Merci à @ mklement0.
Vous pouvez tester les chaînes entre guillemets C ANSI avec la commande od.
Les sorties:
Vous pouvez connaître la signification clairement par les sorties.
la source
C'est comme récupérer la valeur d'une variable:
sont différents, de sorte que le signe dollar évalue essentiellement le contenu.
la source
$'FOO'
(contrairement à$FOO
ce dont il ne s'agissait pas) est une chaîne littérale. Si vous exécutezecho $'VAR'
, vous verrez qu'il imprime la chaîneVAR
, nontest
.