Substituição de string no Bash-Script “Substituição incorreta”

Substituição de string no Bash-Script “Substituição incorreta”

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/shem 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 shou /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.

informação relacionada