簡単なスクリプトを作成しましたが、複数のホストで実行したいと思います。 (つまり、私ははいスクリプトを作成しますが、複数のホストで実行する必要があります。 )スクリプトは機能しますが、最初のホストでのみ機能します。複数のホストを追加すると、エラーメッセージが表示されます。
line 3: MACHINE2: command not found
私は何が間違っていましたか?スクリプトは以下に掲載されています。
#!/bin/sh
HOSTS=MACHINE1 MACHINE 2
for i in $HOSTS; do echo $i
ssh -q $i uname -a;
done
ベストアンサー1
このようなコマンド
xyz=abc def ghi jkl
def
パラメータの使用ghi
、プログラムの実行、jkl
およびxyz
環境変数の設定を示しますabc
。HOSTS
文字列として設定
MACHINE1 MACHINE 2
あなたは言わなければなりません
HOSTS="MACHINE1 MACHINE 2"
MACHINE
(2番目との間にスペースを入れたくないと仮定しますが2
。)ホスト名にスペースやその他の特殊文字が含まれていないため、これを機能させることができます。しかし、配列を使用する方が賢明かもしれません。
HOSTS=(MACHINE1 MACHINE2)
for i in "${HOSTS[@]}"
do
echo "$i"
ssh -q "$i" uname -a
done
この構造を使用すると、特殊文字を含む複数の単語配列要素を持つことができます。
lyrics=("Twinkle twinkle little *" "How I wonder what you are")
for line in "${lyrics[@]}"
do
printf "%s\n" "$line"
done
妥当な理由がない限り、必ずすべてのシェル変数参照(例:"${HOSTS[@]}"
and)を引用する必要があります。"$i"
確かにあなたは何をしているのか知っています。返品、
- 行の末尾にはセミコロンは必要ありません。
- シェルスクリプトでは、システム変数は伝統的に大文字を使用するため、スクリプト変数名に小文字を使用するのが一般的です。
echo
固定文字列を印刷するのに便利ですが、任意のデータで予期しない操作を実行できます。それ遠く使用する方が安全ですprintf
。