コマンドはコマンドラインでは機能しますが、シェルスクリプトでは機能しません。

コマンドはコマンドラインでは機能しますが、シェルスクリプトでは機能しません。

スクリプトを作成していてコマンドの戻り値をキャプチャしようとすると、端末でこのコマンドを使用すると、コマンドが見つかりませんでしたエラーが発生します。

gcloud -q compute snapshots list --format='csv(NAME)'

良い結果。

スクリプトは次のとおりです。

#!/bin/sh
CSV_SNAPSHOTS= $(gcloud -q compute snapshots list --format='csv(NAME)')
IFS=$'\n'

for i in $CSV_SNAPSHOTS
do
    echo "$i"
done

答え1

変数宣言の後(および前)には=スペースを入れてはいけません。=

だからこうする必要があります:

CSV_SNAPSHOTS=$(gcloud -q compute snapshots list --format='csv(NAME)')

また、(ほぼ常に)変数とコマンドの置き換えを引用する必要があることに注意してください。ただし、この場合はコマンド置換を変数に格納するため、引用を避けることもできます。


例:

$ foo="$(echo spam)"
$ echo "$foo"
spam

$ bar= "$(echo egg)"
No command 'egg' found, did you mean:

答え2

エラーは末尾の空白ですが、=出力を変数に保存せずにループから直接読み取ることもできます。

IFS=$'\n'

gcloud -q compute snapshots list --format='csv(NAME)' |
while read -r i; do
    printf "%s\n" "$i"
done

関連情報