このように配列を作成しました。
$ 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
ここで修正する必要があるいくつかの点があります。
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")'
isを使用すると、配列を繰り返すことは
for i in $arr1; do echo $i; done
機能しません。これは誤った設定なので、bash
何とか変換されます${arr1[0]}
。使用する正しい構文は次のとおりです。for i in "${arr1[@]}"; do echo "$i"; done
ループが
arr2
正しくありません。ループが配列内で実行されると仮定できます。しかし、それは文字列です。これは、スペースで区切られた単一の文字列で行われます。まず、arr2
正しい配列形式に変換し、上記のように繰り返す必要があります。if [[ $arr1==$arr2 ]]
ゼロ以外の文字列の長さを比較すると、演算子全体$arr1==$arr2
がそれを完全な文字列として扱うため、同等性チェックも正しくありません[[
。これが正の条件付き一致が表示される理由です。基本test
演算子を使用する場合も同様です[
。 2つの配列を比較する正しい方法は、1つの配列を繰り返して同じかどうかを一致させることです。