
配列内の値の数に関係なく、配列の各要素に対してコマンドを実行するスクリプトを作成しようとしています。ただし、思いついた唯一の解決策は次のとおりです (コマンドをwatch
例として作成)。
watch ${ARRAY[0]}
watch ${ARRAY[1]}
watch ${ARRAY[2]}
…配列は監視する他のコマンドを配置します。
明らかに、これは私が探しているものではありません。これは、コードに記述する配列の位置の数に依存しており、明らかに問題があります。次のようなことを試しました。
watch "${ARRAY[*]}"
…しかし、二重引用符の有無にかかわらず、機能しませんでした。 何かご提案があれば、ぜひお聞かせください。
答え1
まず、${ARRAY[*]}
引用符の有無にかかわらず、 をほとんど使用しないでください。ほとんどの場合、"${ARRAY[@]}"
(を使用する必要があります。と代わりに、二重引用符を使用してください。次に、シェルまたはシェルから実行するプログラムのいずれかにとって特別な意味を持つ名前を誤って使用することを避けるために、小文字または大文字と小文字が混在した変数名を使用する必要があります。
さて、実際の質問ですが、watch
一度実行して配列内の要素の完全なリストを渡そうとしているのでしょうか、それとも各要素ごとに 1 つずつ個別に実行しようとしているのでしょうか、それともwatch
各要素ごとに の個別のインスタンスを一度に実行しようとしているのでしょうか。完全なリストで一度実行するには、次を使用します。
watch "${array[@]}"
各要素ごとに個別に実行するには、次を使用します。
for element in "${array[@]}"; do
watch "$element"
done
各要素に対して一度に個別に実行するには、次のコマンドを開始する前に&
各コマンドが終了するのを待たずに済むように、次のようにします。watch
for element in "${array[@]}"; do
watch "$element" &
done
wait # this waits for all of the `watch` processes to exit before continuing through the script