#!/bin/bash
if [ $# -gt 0 ]; then
snum=( $@ )
echo $snum
fi
./testscript.sh 1234 4568
The Output of echo command is only などのスクリプトを実行するときに、1234
すべての位置パラメータの配列を構築していないと思いますか?
#!/bin/bash
if [ $# -gt 0 ]; then
snum="$@"
echo $snum
fi
./testscript.sh 1234 4568
出力を実行すると、次のようになります。1234 4568
snum=( $@ )
なぜ最初の位置パラメータのみが使用されるのか疑問に思います。
ベストアンサー1
リストコンテキスト"$@"
(二重引用符を含む)で使用して取得します。リスト個別に引用された位置パラメータ。
スカラーコンテキスト"$*"
(二重引用符を含む)で使用して位置引数を連結します。単一文字列最初の文字$IFS
(通常はスペース)を区切り文字として使用します。
$@
引用符なしで(最初の例のように)または"$@"
スカラーコンテキストで(2番目の例のように)使用することはほとんど意味がありません。bash
シェルでスカラーコンテキストで使用する"$@"
ことは、最初の文字を空白に設定するのと同じです。"$*"
$IFS
使用するとsnum=( "$@" )
配列が作成されますsnum
。変数にアクセスすると、$snum
配列の最初の要素が得られます。実際にはアクセスと同じです${snum[0]}
。"${snum[@]}"
同様の方法で個別に参照される要素を提供するリストを使用してください"$@"
。を使用すると"${snum[*]}"
同等の結果が得られますが、"$*"
配列の場合ですsnum
。
snum
位置引数リストから配列を作成して空でない場合は、その配列を印刷すると仮定すると、次のようになります。
#!/bin/bash
snum=( "$@" )
if [ "${#snum[@]}" -gt 0 ]; then
printf '%s\n' "${snum[@]}"
fi
snum
スクリプトに引数が指定されると、要素は別々の行に印刷されます。
実行例:
bash-5.1$ ./script 1 2 3 "hello world" 4
1
2
3
hello world
4
このhello world
パラメータは単一のパラメータのままです。いいえ周囲の引用符を忘れた場合、これが発生します$@
。
コロンで区切られた単一の文字列の位置引数のリストを印刷します。文字列を変更して、位置パラメータ間にコロンを挿入します$IFS
。
#!/bin/bash
IFS=:
snum="$*"
if [ -n "$snum" ]; then
printf '%s\n' "$snum"
fi
違いは、snum
要素配列ではなく単一の文字列であることです。文字列が空でない場合、つまり空でない引数が 1 つ以上のスクリプトに指定されている場合、スクリプトは文字列を出力します。
snum
または、引き続き配列として使用されるように、最初の例を少し変更して、
#!/bin/bash
snum=( "$@" )
if [ "${#snum[@]}" -gt 0 ]; then
IFS=:
printf '%s\n' "${snum[*]}"
fi
実行例:
bash-5.1$ ./script 1 2 3 "hello world" 4
1:2:3:hello world:4