Je remarque que pour définir la nouvelle ligne IFS
devrait avec un préfixe $
IFS=$'\n'
mais si vous définissez deux points,
IFS=:
Est \n
-ce une variable?
Ce $'...'
en bash
est pas le paramètre d' expansion, il est un type particulier de citation introduite par ksh93
qui élargit les \n
, \x0a
, \12
codes à un retour à la ligne. zsh
également ajouté \u000a
. ksh93
et bash
ont également \cj
tout zsh
a \C-J
. ksh93
prend également en charge des variations comme \x{a}
.
C'est $
un indice qu'il s'agit d'une forme ou d'une expansion. Mais dans tous les cas, il diffère des autres formes d'extensions qui utilisent $
(comme $((1 + 1))
, $param
ou $(cmd)
) en ce qu'il n'est pas effectué dans des guillemets doubles ou ici des documents (les echo "$'x'"
sorties $'x'
dans tous les shells ne sont pas spécifiées par POSIX) et son expansion n'est pas sujette à division + glob, il est nettement plus proche d'un opérateur de cotation que d'un opérateur d'expansion.
IFS=\n
définirait IFS sur n
( \
est traité comme un opérateur de citation) et IFS="\n"
ou IFS='\n'
définirait IFS sur les deux caractères barre oblique inverse et n
.
Vous pouvez aussi utiliser:
IFS='
'
ou
IFS="
"
ou
IFS=$'
'
Pour passer une nouvelle ligne littérale, bien que ce soit moins lisible (et on ne peut pas voir autre que d' utiliser des choses comme set list
dans vi
si $IFS
contient d' autres caractères d'espacement dans ce code).
IFS=:
, IFS=':'
, IFS=":"
, IFS=$':'
Tous ensemble IFS :
il n'a pas d' importance que vous utilisez.
$'...'
est supporté (avec des variations) par au moins: ksh93
, zsh
, bash
, mksh
, busybox sh
, FreeBSD sh
. ksh93
et bash
ont également une $"..."
forme de guillemets utilisée pour la localisation de texte, bien qu'elle soit rarement utilisée car elle est lourde à déployer et à utiliser de manière portable et fiable.
Les coquilles es
et fish
peuvent également être utilisées en \n
dehors des guillemets pour s'étendre à la nouvelle ligne.
Certains outils comme printf
, certaines implémentations de echo
ou awk
peuvent également les étendre \n
par eux-mêmes. Par exemple, on peut faire:
printf '\n'
awk 'BEGIN{printf "\n"}'
echo
echo '\n\c' # UNIX compliant echos only
à la sortie du caractère de nouvelle ligne, mais notez que:
IFS = $ (printf '\ n')
ne fonctionnera pas car la substitution de commande ( $(...)
) supprime tous les caractères de nouvelle ligne à la fin. Vous pouvez cependant utiliser:
eval "$(printf 'IFS="\n"')"
Ce qui fonctionne parce que la sortie de printf
se termine par un "
caractère, pas une nouvelle ligne.
Maintenant, pour être complet, dans le rc
shell et les dérivés (comme es
ou akanga
), il $'\n'
y a bien l'expansion de cette \n
variable (une variable dont le nom est la séquence de deux caractères \
et n
). Ces obus ne sont pas une limitation de ce que les caractères des noms de variables peuvent contenir et seulement un type de citations: '...'
.
$ rc
; '\n' = (foo bar)
; echo $'\n'
foo bar
; echo $'\n'(1)
foo
rc
les variables sont également toutes exportées vers l'environnement, mais au moins dans la variante Unix de rc
, pour les noms de variables comme \n
, la version de la variable d'environnement subit une forme d'encodage:
; env | grep foo | sed -n l
__5cn=foo\001bar$
( 0x5c
étant la valeur d'octet de l'ASCII \
; voyez également comment cette variable de tableau a été codée avec un octet 0x1 comme séparateur).
+1
pour le niveau de connaissance inhumain habituelVoici la citation ANSI-C :
Ainsi
$'\n'
est remplacé par une nouvelle ligne.Ceci n'est pas lié à l' expansion des paramètres du shell , malgré l'utilisation de
$
.la source
Des chaînes comme
$'\n'
ont été introduites parksh93
et ne font actuellement pas partie de la norme POSIX.Ils permettent d'utiliser la plupart des échappements de type C, par exemple
$'\u2345'
et les échappements qui sont également pris en charge parecho
.Notez que si vous n'aimez pas (en cas de ksh93 ou bash) utiliser cette méthode d'échappement, vous pouvez toujours utiliser:
ce qui est équivalent mais plus difficile à lire.
BTW: Cette extension a déjà passé le comité standard POSIX, mais elle est prévue pour SUSv8 qui devrait apparaître pas avant l'an 2020 car nous devons d'abord travailler sur notre retard par rapport à la liste actuelle des bogues.
la source
$'...'
extensions diffèrent de celle deecho
. Ils ressemblent plus à ceux de l'argument format deprintf
. Pourecho
, un 0 est requis dans\0123
tandis que pour$'...'
etprintf
format,\0123
serait\012
une nouvelle ligne suivie d'un littéral 3.$'...'
spécification est toujours en cours de discussion. Il reste plusieurs problèmes à résoudre avec le libellé actuellement proposé.\uxxxx
extension), et aucune résolution en vue qui pourrait accueillir les mises en œuvre existantes. Il est donc possible qu'il ne soit pas intégré dans la prochaine version POSIX. Peut-être qu'ils pourraient laisser l'\uxxxx
expansion hors de question8, afin que nous puissions avoir au moins$'\n'
.