Percebo que para definir nova linha IFS
deve com um $ como prefixo
IFS=$'\n'
mas se definir dois pontos, apenas
IFS=:
É \n
uma variável?
Que $'...'
em bash
não é parâmetro de expansão, é um tipo especial de citação introduzido por ksh93
que se expande aqueles \n
, \x0a
, \12
códigos para um caractere de nova linha. zsh
também adicionado \u000a
. ksh93
e bash
também tem \cj
enquanto zsh
tem \C-J
. ksh93
também suporta variações como \x{a}
.
O $
é um sinal de que é alguma forma ou expansão. Mas em qualquer caso, difere de outras formas de expansões que o uso $
(como $((1 + 1))
, $param
ou $(cmd)
) na medida em que não é realizada dentro de aspas ou aqui documentos ( echo "$'x'"
saídas $'x'
em todas as conchas que não é especificado por POSIX) e sua expansão não está sujeita a cisão + glob, é definitivamente mais próximo de um operador de cotação do que de um operador de expansão.
IFS=\n
definiria o IFS como n
( \
é tratado como um operador de citação) e IFS="\n"
ou IFS='\n'
definiria o IFS para a barra invertida de dois caracteres e n
.
Você também pode usar:
IFS='
'
ou
IFS="
"
ou
IFS=$'
'
Para passar uma nova linha literal, embora isso seja menos legível (e não se pode ver à excepção de usar coisas como set list
em vi
se $IFS
contém outros caracteres de espaçamento nesse código).
IFS=:
, IFS=':'
, IFS=":"
, IFS=$':'
Tudo pronto IFS para :
que ele não importa qual você usa.
$'...'
é suportado (com variações) por, pelo menos,: ksh93
, zsh
, bash
, mksh
, busybox sh
, FreeBSD sh
. ksh93
e bash
também possui uma $"..."
forma de aspas usada para localização de texto, embora raramente seja usada, pois é difícil de implantar e usar de forma portável e confiável.
As conchas es
e fish
também podem ser usadas \n
fora das aspas para expandir para a nova linha.
Algumas ferramentas printf
, algumas implementações echo
ou awk
também podem expandi-las \n
sozinhas. Por exemplo, pode-se fazer:
printf '\n'
awk 'BEGIN{printf "\n"}'
echo
echo '\n\c' # UNIX compliant echos only
para saída do caractere de nova linha, mas observe que:
IFS = $ (printf '\ n')
não funcionará porque o comando substitution ( $(...)
) retira todos os caracteres de nova linha à direita. No entanto, você pode usar:
eval "$(printf 'IFS="\n"')"
O que funciona porque a saída de printf
termina em um "
caractere, não em uma nova linha.
Agora, para completude, no rc
shell e derivadas (como es
ou akanga
), $'\n'
é de fato a expansão dessa \n
variável (uma variável cujo nome é a sequência de dois caracteres \
e n
). Essas conchas não têm uma limitação no que personagens nomes de variáveis podem conter e só tem um tipo de aspas: '...'
.
$ rc
; '\n' = (foo bar)
; echo $'\n'
foo bar
; echo $'\n'(1)
foo
rc
As variáveis também são exportadas para o ambiente, mas pelo menos na variante Unix de rc
, para nomes de variáveis como \n
, a versão da variável de ambiente passa por uma forma de codificação:
; env | grep foo | sed -n l
__5cn=foo\001bar$
( 0x5c
sendo o valor de byte de ASCII \
; veja também como essa variável de matriz foi codificada com um byte de 0x1 como separador).
+1
para o nível desumano usual de conhecimentoEsta é a citação ANSI-C :
Assim,
$'\n'
é substituído por uma nova linha.Isso não tem relação com a expansão dos parâmetros do shell , apesar do uso de
$
.fonte
Strings como
$'\n'
foram introduzidasksh93
e atualmente não fazem parte do padrão POSIX.Eles permitem usar a maioria dos escapes em C, por exemplo,
$'\u2345'
e os escapes que também são suportadosecho
.Observe que, se você não quiser (no caso de ksh93 ou bash) usar esse método de escape, ainda poderá usar:
o que é equivalente, mas mais difícil de ler.
BTW: Esta extensão já passou pelo comitê padrão POSIX, mas está programado para o SUSv8 que deve aparecer não antes do ano 2020, porque precisamos primeiro trabalhar em nosso atraso por trás da lista atual de bugs.
fonte
$'...'
expansões diferem das deecho
. Eles são mais parecidos com os do argumento de formatoprintf
. Poisecho
, um 0 é necessário em\0123
enquanto para$'...'
eprintf
formato,\0123
seria\012
uma nova linha seguida por um 3. literal.$'...'
especificação ainda está sendo discutida. Ainda há várias questões a serem resolvidas com a redação atualmente proposta.\uxxxx
expansão) e nenhuma solução à vista que pudesse acomodar as implementações existentes. Portanto, pode não ser a próxima versão do POSIX. Talvez eles possam deixar a\uxxxx
expansão de fora para o problema8, para que ainda possamos ter pelo menos$'\n'
.