Проблема с запуском скрипта оболочки без использования «sh» на macOS Monterey

Проблема с запуском скрипта оболочки без использования «sh» на macOS Monterey

Я новичок в написании скриптов оболочки и в использовании Терминала в целом. Недавно я создал , script.shкоторый хочу использовать, просто введя его имя без полного пути. Итак, я записал путь к каталогу в виде .zprofile:

export "PATH=$PATH:/path/to/scriptdirectory"

и изменил права доступа к файлу с помощью:

% chmod +x script.sh

Если я использую скрипт с:

% sh myscript.sh

все идет гладко, как и предполагалось. Но если я попробую опустить shи ввести:

% myscript.sh

Скрипт начинает выполнять свою первую часть, которая просто считывает переменную, но как только я вставляю значение, появляется следующая строка:

/path/to/scriptdirectory/script.sh:11: = not found

Вот сценарий:

#!/bin/zsh
echo "Do you want to set or change the backup location? (type y/n)"
read SET_BACKUP
while [ "$SET_BACKUP" != "y" ] && [ "$SET_BACKUP" != "n" ]
do
    echo "Please, write y or n:"
    read SET_BACKUP
done
if [ "$SET_BACKUP" == "y" ]
then
    echo "Write the absolute path of the desired backup location:"
    read BACKUP_FOLDER
    echo "Starting backup..."
    cp -R "/fileslocation" "$BACKUP_FOLDER"
    echo "Backup completed."
else
    echo "Starting backup..."
    cp -R "/fileslocation" "$BACKUP_FOLDER"
    echo "Backup completed."
fi

решение1

Разница в том, что вы запускаете скрипт с двумя разными интерпретаторами оболочки.

Когда вы используете sh myscript.sh, вы работаете /bin/shине зшПри shзапуске он считывает ваш скрипт myscript.shи использует правила оболочки sh/bash для своего синтаксиса.

Когда вы используете только myscript.sh, команда, используемая для запуска скрипта, определяется первой строкой: #!/bin/zsh(также известной как shebang). Таким образом, он запускается с использованием zshи использует его правила для синтаксиса.

Я вижу два решения, как это реализовать:

  1. измените первую строку, чтобы вместо этого использовать bash, так что это будет#!/bin/bash
  2. прочитайте больше о том, как работают условные операторы в zsh, и исправьте поврежденную строку (похоже, это строка с if [ "$SET_BACKUP" == "y" ])

решение2

Это не совсем ответ, скорее отформатированный вопрос.

На ум приходят три вещи:

  1. Присваивание переменных не должно иметь пробелов вокруг =:answer=42
  2. $используется только дляде-ссылка на переменную, а не назначение: не делайте этого$answer=42
  3. укажите ваши переменные:if [ "$answer" = 42 ]

Это я пытаюсь прочитать ваши мысли. Вставьте какой-нибудь код в ваш вопрос.

Также используйтеhttps://shellcheck.netдля проверки вашего шелл-кода.

Связанный контент