![arr1 =(1 2 3); arr2=${arr1[@]} 同じですが異なります。](https://linux33.com/image/141475/arr1%20%3D%EF%BC%881%202%203%EF%BC%89%3B%20arr2%3D%24%7Barr1%5B%40%5D%7D%20%E5%90%8C%E3%81%98%E3%81%A7%E3%81%99%E3%81%8C%E7%95%B0%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82.png)
このように配列を作成しました。
$ 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つの配列を繰り返して同じかどうかを一致させることです。
答え2
エラーはあなたの状態です:
[[ $arr1==$arr2 ]]
次に拡張予定:
[[ 1==1 2 3 ]]
以下と同じ:
[[ -n 1==1 2 3 ]]
これは本当です。
また、正しい構文を使用しても、次の点に注意してください。
[[ $arr1 == $arr2 ]]
この条件は、配列arr1
の最初の要素を文字列と1
比較します。arr2
1 2 3
答え3
彼らは同等ではありません。
arr1=(1 2 3)
arr2=${arr1[@]}
if [[ $arr1 == $arr2 ]];then ## Space is required here ( $arr1 == $arr2)
echo yes
fi