Disseram-me que os espaços são importantes em bash
ou em outros scripts de shell e não devo alterar a existência de espaços, a menos que saiba o que estou fazendo. Por "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 exemplo, mudar var="$val"
para var ="$val"
ou vice-versa. Eu quero perguntar
Existem casos 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 outros exemplos além deste exemplo trivial.)
Eu me deparei com essa questão, mas essa é sobre adicionar e remover espaços entre dois caracteres não espaciais, para os quais conheço muitos exemplos de que fariam a diferença.
Qualquer ajuda seria apreciada. Inclua mais variedades de conchas, se possível.
Isso provavelmente é trapaça, mas isso:
é diferente disso:
mesmo que os espaços não estejam entre aspas. ;-)
Mais confusamente, isto:
é diferente disso:
mesmo que pareçam idênticos!
Fora das aspas, o shell usa espaços em branco (espaços, tabulações, nova linha, retorno de linha, etc.) como separador de palavra/token. Que significa:
O número real de espaços em branco entre cada "coisa" não importa, desde que haja pelo menos um.
Se não falamos sobre o caractere de espaço (
U+0020
), mas qualquer caractere de espaço em branco (U+0020
,\n
,\t
, etc.), então um caso particular me vem à mente: Here-Documents.Este código (usando espaços):
Irá imprimir:
Mas este código (usando abas):
Irá imprimir:
Isso porque ( como afirma o POSIX ):
Também tem efeito ao escrever instruções de atribuição. Como se eu dissesse
FOO=xyz
que criaria uma variável de ambiente nomeadaFOO
com valuexyz
, mas se eu separasse os iguais com um espaço, ele pensaria que estou invocando um programa nomeadoFOO
com o arg=xyz
. Portanto, importa quando se trata de determinada sintaxe.Me deparei com um bom exemplo de 'espaço' e pensei em compartilhar aqui. A condição a seguir não é avaliada como verdadeira por i estar entre 100 e 1000.
Observe um espaço ausente entre 1000 e o colchete de fechamento
Mas quando é alterado para o mencionado abaixo, funciona conforme o esperado.