Percebo que para definir a nova linha IFS
deve ter um $ como prefixo
IFS=$'\n'
mas se definir dois pontos, apenas
IFS=:
É \n
uma variável?
Percebo que para definir a nova linha IFS
deve ter um $ como prefixo
IFS=$'\n'
mas se definir dois pontos, apenas
IFS=:
É \n
uma variável?
Isso não é expansão
$'...'
debash
parâmetro, é um tipo especial de citação introduzido porksh93
que expande esses códigos\n
,\x0a
, para um caractere de nova linha. também adicionou / para os caracteres com o ponto de código Unicode correspondente. e também tem enquanto tem . também suporta variações como .\12
zsh
\u000a
\U0000000a
ksh93
bash
\cj
zsh
\C-J
ksh93
\x{a}
O
$
é uma sugestão de que é alguma forma ou expansão. Mas, em qualquer caso, difere de outras formas de expansão que usam$
(como$((1 + 1))
,$param
ou$(cmd)
) porque não é executada entre aspas duplas ou aqui documentos (echo "$'x'"
saídas$'x'
em todos os shells não são especificadas por POSIX) e sua expansão não está sujeita a divisão +glob, é definitivamente mais próximo de um operador de cotação do que de um operador de expansão.IFS=\n
definiria IFS paran
(\
é tratado como um operador de citação) eIFS="\n"
ouIFS='\n'
definiria IFS para os dois caracteres barra invertida en
.Você também pode usar:
ou
ou
Para passar uma nova linha literal, embora isso seja menos legível (e não se pode ver além de usar coisas como se
set list
contém outros caracteres de espaçamento nesse código).vi
$IFS
IFS=:
,IFS=':'
,IFS=":"
,IFS=$':'
tudo definido como IFS para:
que não importa qual você use.$'...'
é suportado (com variações) por pelo menos:ksh93
,zsh
,bash
,mksh
, busyboxsh
, FreeBSDsh
.ksh93
ebash
também tem uma$"..."
forma de aspas usada para localização de texto, embora raramente seja usada, pois é complicada de implantar e usar de forma portátil e confiável.Os shells
es
e também podem usar fora das aspas para expandir para nova linha.fish
\n
Algumas ferramentas como
printf
, algumas implementaçõesecho
ouawk
também podem expandi-las\n
por si mesmas. Por exemplo, pode-se fazer:para a saída do caractere de nova linha, mas observe que:
não funcionará porque a substituição de comando (
$(...)
) remove todos os caracteres de nova linha à direita. No entanto, você pode usar:O que funciona porque a saída de
printf
termina em um"
caractere, não em uma nova linha.Agora, para completar, no
rc
shell e nas derivadas (comoes
ouakanga
),$'\n'
é de fato a expansão dessa\n
variável (uma variável cujo nome é a sequência de dois caracteres\
en
). Esses shells não têm limitação sobre quais caracteres os nomes de variáveis podem conter e têm apenas um tipo de aspas:'...'
.rc
variáveis também são todas exportadas para o ambiente, mas pelo menos na variante Unix derc
, para nomes de variáveis como\n
, a versão da variável de ambiente sofre uma forma de codificação:(
0x5c
sendo o valor de byte de ASCII\
; veja também como essa variável de matriz foi codificada com um byte 0x1 como separador).Esta é uma citação ANSI-C :
Assim
$'\n'
, é substituído por uma nova linha.Isso não está relacionado à expansão de parâmetros do shell , apesar do uso de
$
.Strings como
$'\n'
foram introduzidasksh93
e atualmente não fazem parte do padrão POSIX.Eles permitem usar a maioria dos escapes semelhantes em C, por exemplo,
$'\u2345'
e os escapes que também são suportados porecho
.Observe que, se você não gosta (no caso de ksh93 ou bash) de usar esse método de escape, ainda pode usar:
que é equivalente, mas mais difícil de ler.
BTW: Esta extensão já passou no comitê padrão POSIX, mas está agendada para o SUSv8, que deve aparecer não antes do ano de 2020, porque primeiro precisamos trabalhar em nosso atraso na lista atual de bugs.