macOS Monterey で 'sh' を使用せずにシェル スクリプトを実行すると問題が発生する

macOS Monterey で 'sh' を使用せずにシェル スクリプトを実行すると問題が発生する

私はシェル スクリプトやターミナルの使い方についてはまったくの初心者です。最近、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

違いは、2 つの異なるシェル インタープリターを使用してスクリプトを実行していることです。

を使用するとsh myscript.sh、実行され/bin/shzshではないを実行すると、shスクリプトが読み込まれmyscript.sh、その構文に sh/bash シェル ルールが使用されます。

だけを使用する場合myscript.sh、スクリプトを実行するために使用されるコマンドは、最初の行: #!/bin/zsh(シバンとも呼ばれます) によって決まります。したがって、スクリプトは を使用して実行されzsh、構文にはそのルールが使用されます。

これを機能させるには 2 つの解決策があります:

  1. 最初の行をbashに変更して、次のようにします。#!/bin/bash
  2. zsh での条件文の仕組みについてさらに詳しく読み、壊れた行を修正してください ( の行のようですif [ "$SET_BACKUP" == "y" ])

答え2

これは実際には回答ではなく、フォーマットされた質問です。

3つのことが思い浮かびます:

  1. 変数の割り当てでは、 の前後にスペースを入れないでください=answer=42
  2. $のみに使用されます- 変数を参照する、代入するわけではない:やらない$answer=42
  3. 変数を引用符で囲みます:if [ "$answer" = 42 ]

これはあなたの心を読み取ろうとしているところです。質問にコードをいくつか入れてください。

また、https://shellcheck.netシェルコードを検証します。

関連情報