Quais são alguns casos em que o número de espaços importa em scripts bash (ou outros shell)?

12

Foi-me dito que os espaços são importantes em bash ou outros scripts de shell e não devo alterar a existência de espaços a menos que eu saiba o que estou fazendo. Ao "alterar a existência", quero dizer, inserir um espaço entre dois caracteres não espaciais ou remover um espaço entre dois caracteres não espaciais, por ex. alterando var="$val" para var ="$val" ou vice-versa. Eu quero perguntar

Há algum caso em que usar um único espaço ou usar vários espaços consecutivos em um script de shell faz diferença? .

(É claro que inserir / excluir um espaço entre aspas faz diferença, como mudar de echo "a b" para echo "a b" ou vice-versa. Estou procurando exemplos além deste exemplo trivial.)

Eu encontrei esta pergunta mas essa é sobre adicionar e remover espaços entre dois caracteres não-espaciais para os quais eu conheço muitos exemplos que isso faria diferença.

Qualquer ajuda seria apreciada. Inclua mais variedades de conchas, se possível.

    
por Weijun Zhou 29.12.2017 / 03:41

4 respostas

17

Fora das aspas, o shell usa espaço em branco (espaços, tabulações, nova linha, retorno de carro, etc.) como separador de palavra / token. Isso significa:

  • As coisas não separadas por espaço em branco são consideradas uma "palavra".
  • As coisas separadas por um ou mais caracteres de espaços em branco são consideradas como duas (ou mais) palavras.

O número real de caracteres em branco entre cada "coisa" não importa, desde que haja pelo menos um.

    
por 29.12.2017 / 03:51
23

Isso provavelmente é uma trapaça, mas isso:

rm foo\ bar         # "delete the file named 'foo bar'"

é diferente disso:

rm foo\  bar        # "delete the files named 'foo ' and 'bar'"

mesmo que os espaços não sejam entre aspas. ; -)

Mais confusamente, isso:

rm \
    foo          # "delete the file named 'foo'"

é diferente disso:

rm \ 
    foo          # "delete the file named ' ', then run the command 'foo'"

mesmo que eles pareçam idênticos!

    
por 29.12.2017 / 06:35
12

Se não falarmos sobre o caractere de espaço ( U+0020 ), mas qualquer caractere de espaço em branco ( U+0020 , \n , \t , etc.), um determinado caso venha à minha mente: Aqui Documentos.

Este código (usando espaços):

cat <<- 'EOF'
<space><space>foo
EOF

imprimirá:

  foo

Mas este código (usando guias):

cat <<- 'EOF'
<tab><tab>foo
EOF

imprimirá:

foo

Isso porque ( estados POSIX ):

If the redirection operator is <<-, all leading <tab> characters shall be stripped from input lines and the line containing the trailing delimiter.

    
por 29.12.2017 / 04:35
2

Também tem um efeito ao escrever instruções de atribuição. Como se eu dissesse FOO=xyz ele criaria uma variável de ambiente chamada FOO com valor xyz , mas se eu separar os iguais com um espaço, ele pensará que estou invocando um programa chamado FOO com o arg %código%. Então, importa quando se trata de certa sintaxe.

    
por 30.12.2017 / 06:29