ちょっと立ち往生しています。私の使命は、3番目と4番目を除いて、スクリプトの引数を逆の順序で印刷することです。
私が持っているのは次のコードです。
#!/bin/bash
i=$#
for arg in "$@"
do
case $i
in
3) ;;
4) ;;
*) eval echo "$i. Parameter: \$$i";;
esac
i=`expr $i - 1`
done
私はeval(PHPの帽子のヒント)が嫌いなので、それがないソリューションを探していますが、見つかりません。
パラメータの位置を動的に定義する方法は?
PS:いいえ、これは課題ではありません。私はテストのためにシェルを学んでいて、古いテストを解決しようとしています。
ベストアンサー1
eval
動的に選択された場所を介して位置パラメータにアクセスする唯一の移植可能な方法。 (使用しない)値の代わりにインデックスを明示的に繰り返すと、スクリプトはよりきれいになります。expr
スクリプトをアンティークBourneシェルで実行したくない限り、操作$((…))
はPOSIXにあります。使用をeval
可能な限り最小の部分に制限します。たとえば、使用しないでeval echo
一時変数に値を割り当てます。
i=$#
while [ "$i" -gt 0 ]; do
if [ "$i" -ne 3 ] && [ "$i" -ne 2 ]; then
eval "value=\${$i}"
echo "Parameter $i is $value"
fi
i=$((i-1))
done
Bashでは、を使用して名前付き${!i}
パラメータの値を表すことができます$i
。このメソッド$i
は、名前付き引数または数値(位置引数を表す)の場合に機能します。使用すると、他のbashの便利な機能も活用できます。
for ((i=$#; i>0; i--)); do
if ((i != 3 && i != 4)); then
echo "Parameter $i is ${!i}"
fi
done