Se o exemplo a seguir, que define a IFS
variável de ambiente como um caractere de avanço de linha ...
IFS=$'\n'
- O que significa exatamente o cifrão ?
- O que faz neste caso específico?
- Onde posso ler mais sobre esse uso específico (o Google não permite caracteres especiais nas pesquisas e não sei o que procurar)?
Eu sei qual é a IFS
variável de ambiente e qual é o \n
caractere (avanço de linha), mas por que não usar apenas o seguinte formulário:
IFS="\n"
(que não funciona)?
Por exemplo, se eu quiser percorrer todas as linhas de um arquivo e usar um loop for, poderia fazer o seguinte:
for line in (< /path/to/file); do
echo "Line: $line"
done
No entanto, isso não funcionará direito, a menos que IFS
esteja definido como um caractere de avanço de linha. Para fazê-lo funcionar, eu teria que fazer o seguinte:
OLDIFS=$IFS
IFS=$'\n'
for line in (< /path/to/file); do
echo "Line: $line"
done
IFS=$OLDIFS
Nota: Eu não preciso de outra maneira de fazer a mesma coisa, já conheço muitas outras ... Só estou curioso sobre isso $'\n'
e me perguntei se alguém poderia me dar uma explicação sobre isso.
\n
é apenas uma letra (escapada) n. Você está certo'\n'
e"\n"
é folgado, seguido por n.$'\n'
é específico do bash - não funcionará em um shell POSIX (/bin/sh
). Para obter o mesmo efeito de uma maneira compatível com POSIX, você pode digitarIFS='
, em seguida, bateu retorno ao digitar um caractere real nova linha, em seguida, digite o fechamento'
IFS=$(echo -e '\n')
também deve fazê-lo de maneira compatível com POSIX.-e
não está definido e\n
sem-e
funciona como uma extensão XSI: pubs.opengroup.org/onlinepubs/9699919799/utilities/… .printf '\n'
rocks;)Apenas para dar à construção seu nome oficial : as seqüências de caracteres do formulário
$'...'
são chamadas de seqüências de caracteres C-C ANSI .Ou seja, como nas seqüências de caracteres [ANSI] C, as seqüências de escape de folga são reconhecidas e expandidas para seu equivalente literal (veja abaixo a lista completa de seqüências de escape suportadas).
Após essa expansão, as
$'...'
strings se comportam da mesma maneira que as'...'
strings - ou seja, são tratadas como literais, NÃO sujeitas a nenhuma expansão adicional da shell .Por exemplo,
$'\n'
expande para um caractere literal de nova linha - que é algo que uma string regular do bash literal (se'...'
ou"..."
) não pode fazer. [1]Outro recurso interessante é que as seqüências de caracteres com citação ANSI C podem escapar
'
(aspas simples) como\'
, as quais'...'
(seqüências de caracteres com aspas simples regulares) não podem:Lista de sequências de escape suportadas :
[1] Você pode, no entanto, incorporar novas linhas reais nas strings '...' e "..."; ou seja, você pode definir cadeias que abrangem várias linhas.
fonte
Em http://www.linuxtopia.org/online_books/bash_guide_for_beginners/sect_03_03.html :
Eu acho que está forçando o script a escapar do feed de linha para o padrão ANSI-C apropriado.
fonte
Recuperando o IFS padrão - isso
OLDIFS=$IFS
não é necessário. Execute o novo IFS no subshell para evitar a substituição do IFS padrão:Além disso, eu realmente não acredito que você recupere completamente o antigo IFS. Você deve aspas duplas para evitar quebras de linha como
OLDIFS="$IFS"
.fonte
args=$(IFS='&'; echo "$*")
. restaurarIFS
de$' \t\n'
uma maneira amigável para o shell Bourne não é tarefa fácil.Besides I don't really believe you recover the old IFS fully
: a divisão de palavras não é realizada no RHS de atribuições de variáveis (mas a remoção de cotações é), portanto,OLDIFS=$IFS
eOLDIFS="$IFS"
se comporta da mesma maneira.As seqüências de caracteres C-C ANSI são um ponto-chave. Graças a @ mklement0.
Você pode testar seqüências de caracteres citadas em ANSI C com o comando od.
Saídas:
Você pode conhecer claramente o significado pelas saídas.
fonte
É como recuperar o valor de uma variável:
são diferentes, então o cifrão avalia basicamente o conteúdo.
fonte
$'FOO'
(ao contrário$FOO
que esta questão não tratava) é uma string literal. Se você executarecho $'VAR'
, verá que ele imprime a sequênciaVAR
, nãotest
.