arr1 =(1 2 3); arr2=${arr1[@]} 同じですが異なります。

arr1 =(1 2 3); arr2=${arr1[@]} 同じですが異なります。

このように配列を作成しました。

$ arr1=(1 2 3) ; arr2=${arr1[@]}

繰り返しを使用して確認してください。

$ for i in $arr1; do echo $i; done
1

$ for i in $arr2; do echo $i; done
1
2
3

彼らは平等です

$ if [[ $arr1==$arr2 ]];then echo yes ;fi
yes

この状況をどのように理解する必要がありますか?

ベストアンサー1

ここで修正する必要があるいくつかの点があります。

  1. arr1配列を作成するとarr2同じです。いいえ、まさにその人です。いいえ。ステートメントarr1は有効ですがarr2無効です!文字列です。配列拡張の出力をarr1文字列として指定するには:

    arr2=${arr1[@]}
    declare -p arr2
    declare -- arr2="2 3 4"
    

    配列として宣言するには、(..)現在の配列拡張を適切に参照してarr1要素を分離したままにする必要があります。

    arr2=("${arr1[@]}")
    declare -p arr2
    declare -a arr2='([0]="2" [1]="3" [2]="4")'
    
  2. isを使用すると、配列を繰り返すことはfor i in $arr1; do echo $i; done機能しません。これは誤った設定なので、bash何とか変換されます${arr1[0]}。使用する正しい構文は次のとおりです。

    for i in "${arr1[@]}"; do echo "$i"; done
    

    ループがarr2正しくありません。ループが配列内で実行されると仮定できます。しかし、それは文字列です。これは、スペースで区切られた単一の文字列で行われます。まず、arr2正しい配列形式に変換し、上記のように繰り返す必要があります。

  3. if [[ $arr1==$arr2 ]]ゼロ以外の文字列の長さを比較すると、演算子全体$arr1==$arr2がそれを完全な文字列として扱うため、同等性チェックも正しくありません[[。これが正の条件付き一致が表示される理由です。基本test演算子を使用する場合も同様です[。 2つの配列を比較する正しい方法は、1つの配列を繰り返して同じかどうかを一致させることです。

おすすめ記事