Eu tento uma substituição básica de string em um script bash:
#!/bin/bash
x="I love Linux"
echo "${x/Linux/Unix}"
Funciona bem no meu mac, mas não funciona no meu servidor. Tentei exemplos diferentes de vários sites, mas sempre recebo o erro:
Bad substitution
Minha versão bash:GNU bash, Version 4.4.12(1)-release (x86_64-pc-linux-gnu)
O que estou fazendo de errado?
Responder1
echo "${x/Linux/Unix}"
é a sintaxe correta no bash desde a versão 2.0, lançada em 1996.
Bash não emite a mensagem de erro exata Bad substitution
. Sua mensagem quando encontra algo que parece quase, mas não exatamente, uma substituição de parâmetro, é um pouco diferente:
$ bash -c '${}'
bash: ${}: bad substitution
Por outro lado, dash, que é a implementação /bin/sh
em muitos sistemas Linux, emite exatamente esta mensagem:
$ dash -c 'echo "${x/Linux/Unix}"'
dash: 1: Bad substitution
O erro é uma dica suficiente de que,como Kusalananda notou, na verdade você não está executando esse script como um programa: você está executando algum programa, presumivelmente sh
ou /bin/sh
, e solicitando que ele execute esse script. Seu script é um programa bash correto, mas não um programa sh correto, portanto não funcionará em sistemas onde sh é um dialeto diferente que não possui o mesmo recurso definido como bash.
Seu script é um programa independente. OShebangA linha no topo do script informa ao sistema qual intérprete usar. Para executar o script, basta digitar seu caminho ou o nome do arquivo se estiver no caminho de pesquisa do comando ( $PATH
). Como qualquer outro programa executável, seja ele um script (possui uma linha shebang) ou não (um binário que o kernel executa sozinho 1 ), ele precisa ter permissões de execução ( chmod +x path/to/script
). Se por algum motivo você tiver um script que não seja um programa independente e quiser executá-lo com bash, execute bash path/to/script
, não sh path/to/script
.
1 Ou com outros meios de transmitir como o arquivo será executado, como o mecanismo binfmt_misc no Linux.