A execução do script no terminal está funcionando perfeitamente, mas depois de criar a execução do arquivo .sh, é exibido erro

0
for file in Cadence*
do
mv -i "${file}" "${file/John/Krishna}"
done

consigo rodar o script copie e cole no terminal ele está funcionando perfeitamente, mas depois de criar o arquivo .sh e execute gera o erro como erro de sintaxe.

./bulkCopyFiles.sh > fedora.txt
./bulkCopyFiles.sh: line 2: syntax error near unexpected token '$'do\r''
'/bulkCopyFiles.sh: line 2: 'do
    
por Abhishek Gowlikar 02.05.2018 / 10:57

1 resposta

4

Existem 2 questões.

1 terminações de linha

syntax error near unexpected token '$'do\r''

Parece que você usou finais de linha no estilo da Microsoft ( \r\n ou CR-LF) em vez de estilo Unix ( \n ou somente LF). A maioria dos intérpretes de shell não gosta disso.

Você pode converter os finais de linha com dos2unix :

dos2unix bulkCopyFiles.sh

2 Escolha do intérprete / Shebang

Você precisa colocar um Shebang no início do seu script Bash para indicar que deve ser interpretado por Bash .

#!/bin/bash
for file in Cadence*
do
  mv -i "${file}" "${file/John/Krishna}"
done

Caso contrário, o Linux usará como padrão o interpretador /bin/sh , que não é o Bash no Ubuntu, mas algum outro interpretador parecido com o Bourne, com um conjunto de recursos de linguagem menor (no Ubuntu é o Dash). >). Nesse caso, Dash não está familiarizado com a substituição do padrão de Bash expansão de parâmetro .

Apêndice: Shellcheck

Use Shellcheck (também disponível no pacote epônimo shellcheck ) para verificar a sintaxe do seu scripts de shell. Para o seu, sugere:

Line 1:
for file in Cadence*
^-- SC2148: Tips depend on target shell and yours is unknown. Add a shebang.
    
por David Foerster 02.05.2018 / 11:08