できません。
このスクリプトは、targetとcommandという2つのパラメータを使用します。有効なターゲットが配列に割り当てられています。ターゲットが「all」の場合、スクリプトはすべてのターゲットを繰り返す必要があります。
#!/bin/bash
# recur.sh
targets=('aaa' 'bbb' 'ccc' 'ddd')
if [ "$1" == "all" ] ; then
for i in $targets ; do
echo $2" --> "$i
./$0 $i $2
done
exit 0
fi
echo "Target "$1" just received command '"$2"'"
exit 0
次のような結果が出ると予想されます。
$ recur all boggle
boggle --> aaa
Target aaa just received command 'boggle'
boggle --> bbb
Target bbb just received command 'boggle'
boggle --> ccc
Target ccc just received command 'boggle'
boggle --> ddd
Target ddd just received command 'boggle'
ただし、スクリプトは最初の反復で終了します。
$ recur all boggle
boggle --> aaa
Target aaa just received command 'boggle'
答え1
問題は再帰ではなく繰り返し項目にあります。上記の方法を試してみると、目的の結果が得られません。
$ targets=(aaa bbb ccc ddd)
$ for i in $targets; do echo $i; done
aaa
配列を繰り返すには、配列の項目リストを作成する必要があります。たとえば、次のようになります。このリンク:
だからあなたは
#!/bin/bash
# recur.sh
targets=('aaa' 'bbb' 'ccc' 'ddd')
if [ "$1" == "all" ] ; then
for i in ${targets[@]}; do
echo $2" --> "$i
./$0 $i $2
done
exit 0
fi
echo "Target "$1" just received command '"$2"'"
exit 0
答え2
他の人は、リストにアクセスするときに使用される構文に問題があると指摘しました。しかし、これはスクリプトの唯一の問題ではありません。また、引用符なしで変数を使用しました。引用符なしで使用すると、$variablename
変数にシェルが解釈できる文字が含まれていると、予期しない結果が発生します。
これらの問題を回避するためにスクリプトを変更する方法は次のとおりです。
#!/bin/bash
# recur.sh
targets=('aaa' 'bbb' 'ccc' 'ddd')
if [ "$1" == "all" ] ; then
for i in "${targets[@]}"; do
echo "$2 --> $i"
"$0" "$i" "$2"
done
exit 0
fi
echo "Target $1 just received command '$2'"
exit 0
特別な理由がない限り、変数の使用を二重引用符で囲む習慣が必要です。
答え3
$targets
問題は代わりに使用しているので、配列内のすべての要素を繰り返すのではなく、1つの要素だけを繰り返すことです${targets[@]}
。
次の修正を試してください。
targets=('aaa' 'bbb' 'ccc' 'ddd')
if [ "$1" == "all" ] ; then
for i in ${targets[@]} ; do
echo $2" --> "$i
echo "Target "$i" just received command '"$2"'"
done
fi
exit 0
ここでは再帰は必要ありません。