Запуск сценария в терминале работает отлично, но после создания файла .sh

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
0
задан 2 May 2018 в 12:04

2 ответа

Есть два вопроса.

1 Окончания строк

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

Похоже, вы использовали окончание строк в стиле Microsoft (\r\n или CR-LF) вместо Unix -стиль (\n или только LF).

Вы можете преобразовать окончания строк с помощью dos2unix:

dos2unix bulkCopyFiles.sh

2 Выбор переводчика / Shebang

Вы нужно поставить 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 (также доступный в одноименном пакете shellcheck), чтобы проверьте синтаксис сценариев вашей оболочки. Для вас это предлагает:

Line 1: for file in Cadence* ^-- SC2148: Tips depend on target shell and yours is unknown. Add a shebang.
4
ответ дан 17 July 2018 в 15:29

Есть два вопроса.

1 Окончания строк

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

Похоже, вы использовали окончание строк в стиле Microsoft (\r\n или CR-LF) вместо Unix -стиль (\n или только LF).

Вы можете преобразовать окончания строк с помощью dos2unix:

dos2unix bulkCopyFiles.sh

2 Выбор переводчика / Shebang

Вы нужно поставить 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 (также доступный в одноименном пакете shellcheck), чтобы проверьте синтаксис сценариев вашей оболочки. Для вас это предлагает:

Line 1: for file in Cadence* ^-- SC2148: Tips depend on target shell and yours is unknown. Add a shebang.
4
ответ дан 23 July 2018 в 16:25
  • 1
    Поскольку вы никогда не принимали ответа раньше: если это ответит на ваш вопрос, не забудьте нажать серый ☑ под номером слева от этого текста, чтобы принять его , что означает «да, этот ответ действительно "! – David Foerster 2 May 2018 в 14:25

Другие вопросы по тегам:

Похожие вопросы: