![Проблема с запуском скрипта оболочки без использования «sh» на macOS Monterey](https://rvso.com/image/1672349/%D0%9F%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D0%B0%20%D1%81%20%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA%D0%BE%D0%BC%20%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%20%D0%BE%D0%B1%D0%BE%D0%BB%D0%BE%D1%87%D0%BA%D0%B8%20%D0%B1%D0%B5%D0%B7%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20%C2%ABsh%C2%BB%20%D0%BD%D0%B0%20macOS%20Monterey.png)
Я новичок в написании скриптов оболочки и в использовании Терминала в целом. Недавно я создал , 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
и использует его правила для синтаксиса.
Я вижу два решения, как это реализовать:
- измените первую строку, чтобы вместо этого использовать bash, так что это будет
#!/bin/bash
- прочитайте больше о том, как работают условные операторы в zsh, и исправьте поврежденную строку (похоже, это строка с
if [ "$SET_BACKUP" == "y" ]
)
решение2
Это не совсем ответ, скорее отформатированный вопрос.
На ум приходят три вещи:
- Присваивание переменных не должно иметь пробелов вокруг
=
:answer=42
$
используется только дляде-ссылка на переменную, а не назначение: не делайте этого$answer=42
- укажите ваши переменные:
if [ "$answer" = 42 ]
Это я пытаюсь прочитать ваши мысли. Вставьте какой-нибудь код в ваш вопрос.
Также используйтеhttps://shellcheck.netдля проверки вашего шелл-кода.