${array[*]}と${array[@]}の違いは何ですか?いつ他のものよりも1つを使うべきですか? [コピー]

${array[*]}と${array[@]}の違いは何ですか?いつ他のものよりも1つを使うべきですか? [コピー]

次のコードを使用してください。

#! /bin/bash                         
                                     
declare -a arr=("element1"           
                "element2" "element3"
                "element4" )         
echo "1"                             
echo "${arr[@]}"                     
                                     
echo "2"                             
echo ${arr[*]}                       

出力は次のとおりです

1
element1 element2 element3 element4
2
element1 element2 element3 element4

したがって、出力は同じです。

それでは、いつ1つの方法を他の方法よりも使用する必要がありますか?

答え1

次の3つのループの出力を比較します。

#!/bin/bash

declare -a arr=("this is" "a test" "of bash")

echo "LOOP 1"
for x in ${arr[*]}; do
  echo "item: $x"
done
echo

echo "LOOP 2"
for x in "${arr[*]}"; do
  echo "item: $x"
done
echo

echo "LOOP 3"
for x in "${arr[@]}"; do
  echo "item: $x"
done

上記のスクリプトは、次の出力を生成します。

LOOP 1
item: this
item: is
item: a
item: test
item: of
item: bash

LOOP 2
item: this is a test of bash

LOOP 3
item: this is
item: a test
item: of bash

何かの目的を指します。"${array[@]}" 二重引用符で囲む空白が含まれていても配列内の項目を保持しますが、その"${array[*]}"情報を使用または失います${array[*]}


bash(1)これについては、マニュアルページの「配置」セクションに説明されています。

参照配列のすべての要素を使用できます${name[subscript]}。パス名拡張との競合を防ぐには、中かっこが必要です。下付き文字がある場合、@または*単語が name のすべてのメンバーに展開されます。これらの下付き文字は、単語が二重引用符で囲まれている場合にのみ異なります。単語が二重引用符で囲まれている場合は、単一の単語${name[*]}に展開され、各配列メンバーの値はIFS特殊変数の最初の文字で区切られ、${name[@]}nameの各要素は別々の単語に展開されます。

関連情報