![macOS Monterey で 'sh' を使用せずにシェル スクリプトを実行すると問題が発生する](https://rvso.com/image/1672349/macOS%20Monterey%20%E3%81%A7%20'sh'%20%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%9B%E3%81%9A%E3%81%AB%E3%82%B7%E3%82%A7%E3%83%AB%20%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%81%A8%E5%95%8F%E9%A1%8C%E3%81%8C%E7%99%BA%E7%94%9F%E3%81%99%E3%82%8B.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
違いは、2 つの異なるシェル インタープリターを使用してスクリプトを実行していることです。
を使用するとsh myscript.sh
、実行され/bin/sh
、zshではないを実行すると、sh
スクリプトが読み込まれmyscript.sh
、その構文に sh/bash シェル ルールが使用されます。
だけを使用する場合myscript.sh
、スクリプトを実行するために使用されるコマンドは、最初の行: #!/bin/zsh
(シバンとも呼ばれます) によって決まります。したがって、スクリプトは を使用して実行されzsh
、構文にはそのルールが使用されます。
これを機能させるには 2 つの解決策があります:
- 最初の行をbashに変更して、次のようにします。
#!/bin/bash
- zsh での条件文の仕組みについてさらに詳しく読み、壊れた行を修正してください ( の行のようです
if [ "$SET_BACKUP" == "y" ]
)
答え2
これは実際には回答ではなく、フォーマットされた質問です。
3つのことが思い浮かびます:
- 変数の割り当てでは、 の前後にスペースを入れないでください
=
。answer=42
$
のみに使用されますデ- 変数を参照する、代入するわけではない:やらない$answer=42
- 変数を引用符で囲みます:
if [ "$answer" = 42 ]
これはあなたの心を読み取ろうとしているところです。質問にコードをいくつか入れてください。
また、https://shellcheck.netシェルコードを検証します。