私が持っているとしましょう:
for i in $@; do
echo ${i+1}
done
これをシェル$ test.sh 3 5 8 4
で実行すると、1 1 1 1
$ {i + 1}が機能しない理由が出力されますか?コマンドライン引数のリストについて、次の引数にアクセスしようとしています。
シェルの各文字には特別な意味がある場合があります。
このコード${i+1}
は「iに1を追加する」という意味ではありません。
意味を確認するには、次のコマンドを実行します。
LESS=+/'\{parameter\:\+word\}' man bash
そして読んでください:
${parameter:+word}
代替値を使用します。パラメータがnullまたは未設定の場合、何も置換されません。それ以外の場合は、単語の展開が置換されます。
そして少し上:
コロンを省略すると、設定されていないパラメーターに対してのみテストが行われます。
$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
ですか?:間接参照:
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
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加