在 macOS Monterey 上執行 shell 腳本而不使用“sh”時出現問題

在 macOS Monterey 上執行 shell 腳本而不使用“sh”時出現問題

我對 shell 腳本編寫和終端的使用都很陌生。我最近製作了一個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

不同之處在於您使用兩個不同的 shell 解釋器來運行腳本。

當你使用 時sh myscript.sh,你正在運行/bin/sh並且不是 zsh。運行時,sh它會讀取您的腳本myscript.sh並使用 sh/bash shell 規則作為其語法。

當您使用 just 時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驗證您的 shell 程式碼。

相關內容