Tratamento de espaço em branco no OS X vs Linux no Bash

1

Estou tentando executar um script muito simples em algumas plataformas diferentes:

#!/bin/bash
STRING="this is a test"
echo $STRING

, e não sei dizer por que, no Mavericks e no Yosemite, recebo a saída:

./starter.sh line 2: is": command not found

enquanto um simulador de terminal Bash online (desculpe, eu não tenho nenhuma configuração do Linux à mão, então estou usando: this ) o código como esperado. De acordo com Os próprios documentos básicos da Apple devem funcionar. IOW, aspas duplas são simplesmente ignoradas.

Alguns pontos:

  • não há espaços no meio do nome da variável, é igual ao operador e ao valor atribuído;
  • escape de espaços não é uma resposta válida no meu caso, já que o objetivo final é fazer alguns scripts mais complicados ... mas obviamente eu devo "graduar" esse pequeno passo primeiro.
por elder elder 10.08.2015 / 22:12

2 respostas

2

A mensagem de erro não está correta, mas parece muito com o que você obteria se o script tivesse aspas duplas (ou "inteligentes") em vez de aspas duplas simples (ASCII). O shell não entende as citações extravagantes, então eles farão o script se comportar de maneiras muito estranhas. Tente imprimir seu script com:

LC_ALL=c cat -vet starter.sh

Isto mostrará qualquer caractere estranho (não-ASCII ou não imprimível) no arquivo. Se imprime algo como:

#!/bin/bash$
STRING=?M-^@M-^\this is a test?M-^@M-^]$
echo $STRING$

... os bits "? M - ^ @ M - ^ \" e "? M - ^ @ M- ^]" são citações extravagantes na codificação UTF-8. Por outro lado, se as linhas do arquivo terminarem com "^ M $" em vez de apenas "$", então o Sleafar está certo e você tem um arquivo formatado em DOS / Windows.

    
por 11.08.2015 / 03:42
1

Verifique o que é usado como o "fim da linha" no seu arquivo. Sistemas diferentes usam diferentes caracteres de controle:

  • Linux: LF
  • Windows: CR+LF
  • Mac: CR

Você não pode usar o mesmo script em todos os sistemas sem convertê-lo.

    
por 11.08.2015 / 00:09