以下があるとしましょう。
for i in $@; do
echo ${i+1}
done
シェルで実行すると Why ${i+1} does not work?$ test.sh 3 5 8 4
が出力されます。1 1 1 1
コマンドライン引数リストから次の引数にアクセスしようとしています。
ベストアンサー1
シェルの各文字は特別な意味を持つことができます。
このコードは${i+1}
「i+1」を意味しません。
これが何を意味するのかを理解するには、次のコマンドを実行します。
LESS=+/'\{parameter\:\+word\}' man bash
そして読んでください:
${parameter:+word}
代替値を使用してください。引数が空であるか設定されていない場合は何も置き換えられず、そうでない場合は単語の拡張が置き換えられます。
少し上:
コロンを省略すると、設定されていないパラメータのみがテストされます。
$i
ループが値を設定するため、for i in $@;
「代替値」が置き換えられて1
印刷されます。
パラメーター値を1ずつ増やすには、次のようにします。
for i
do echo "$((i+1))"
done
必要ありませんin "$@"
(そしてすべての拡張子を引用するのに慣れています)。
$ ./test.sh 3 5 8 4
4
6
9
5
続く主張。
しかし、これは「次の主張」でもありません。重要な問題は、パラメータのインデックスではなくパラメータの値を使用するループにあります。i
各パラメータの値ではなくパラメータのインデックスを繰り返す必要があります。i
それは次のとおりです。
for (( i=1; i<=$#; i++)); do
echo "${i}"
done
これにより、次のインデックスが印刷されます。
$ ./test.sh 3 5 8 4
1
2
3
4
間接的な
$i
positionのパラメータにどのようにアクセスしますか? :間接使用:
for (( i=1; i<=$#; i++)); do
echo "${!i}"
done
簡単な!
追加が見えますか?
これで、次のように実行されます。
$ ./test.sh 3 5 8 4
3
5
8
4
最後の解決策。
現在のパラメータと次のパラメータを印刷するには、次のコマンドを使用します。
for (( i=1; i<=$#; i++)); do
j=$((i+1))
echo "${!i} ${!j}"
done
いいえ、変数の値を計算するよりも簡単な方法はありません$j
。
$ ./test.sh 3 5 8 4
3 5
5 8
8 4
4
これはテキストにも当てはまります。
$ ./test.sh sa jwe yqs ldfgt
sa jwe
jwe yqs
yqs ldfgt
ldfgt