for file in Cadence*
do
mv -i "${file}" "${file/John/Krishna}"
done
Я могу запустить скрипт и вставить его на терминал, он работает отлично, но после создания файла .sh и выполнения выдает ошибку, например, синтаксическую ошибку.
./bulkCopyFiles.sh > fedora.txt
./bulkCopyFiles.sh: line 2: syntax error near unexpected token `$'do\r''
'/bulkCopyFiles.sh: line 2: `do
Есть два вопроса.
syntax error near unexpected token `$'do\r''
Похоже, вы использовали окончание строк в стиле Microsoft (\r\n или CR-LF) вместо Unix -стиль (\n или только LF).
Вы можете преобразовать окончания строк с помощью dos2unix:
dos2unix bulkCopyFiles.sh
Вы нужно поставить Shebang в начале вашего сценария Bash, чтобы указать, что он должен интерпретироваться Bash.
#!/bin/bash
for file in Cadence*
do
mv -i "${file}" "${file/John/Krishna}"
done
В противном случае Linux по умолчанию будет использовать интерпретатор /bin/sh, который является Bash в Ubuntu, но некоторый другой интерпретатор, похожий на Bourne, с меньшим набором функций языка (в Ubuntu это Dash). В этом случае Dash не знаком с заменой шаблона Bash Shebang .
Используйте Shellcheck (также доступный в одноименном пакете shellcheck), чтобы проверьте синтаксис сценариев вашей оболочки. Для вас это предлагает:
Line 1:
for file in Cadence*
^-- SC2148: Tips depend on target shell and yours is unknown. Add a shebang.
Есть два вопроса.
syntax error near unexpected token `$'do\r''
Похоже, вы использовали окончание строк в стиле Microsoft (\r\n или CR-LF) вместо Unix -стиль (\n или только LF).
Вы можете преобразовать окончания строк с помощью dos2unix:
dos2unix bulkCopyFiles.sh
Вы нужно поставить Shebang в начале вашего сценария Bash, чтобы указать, что он должен интерпретироваться Bash.
#!/bin/bash
for file in Cadence*
do
mv -i "${file}" "${file/John/Krishna}"
done
В противном случае Linux по умолчанию будет использовать интерпретатор /bin/sh, который является Bash в Ubuntu, но некоторый другой интерпретатор, похожий на Bourne, с меньшим набором функций языка (в Ubuntu это Dash). В этом случае Dash не знаком с заменой шаблона Bash Shebang .
Используйте Shellcheck (также доступный в одноименном пакете shellcheck), чтобы проверьте синтаксис сценариев вашей оболочки. Для вас это предлагает:
Line 1:
for file in Cadence*
^-- SC2148: Tips depend on target shell and yours is unknown. Add a shebang.