2017-09-25 18 views
2

forループでは、私は探しています:Array1の長さがArray2の長さと一致する場合は、break forループです。 (スクリプトが正常に動作しながら)Array1の長さがArray2の長さ(bash)と等しいかどうかを確認してください

Shellcheckでエラーが発生します私はまだbashのを学んだし、私の先生は、「常にShellcheckで検証」と「常に二重の[[]]で条件文を置くと言わ

if [[ "${!Array1[@]}" == "${!Array2[@]}" ]] ; then 
      break; 
    fi 

^-- SC2199: Arrays implicitly concatenate in [[ ]]. Use a loop (or explicit * instead of @). 

"とする『』配列の長さのために*

を使用することはありませんエラー(s)は補正

if [ "${!Array1[*]}" == "${!Array2[*]}" ] ; then 
      break; 
    fi 

で除去されている私はここでのベストプラクティスは何か不思議でしたか?

+0

長さによってあなたは要素の数を意味する場合は、 ' "$ {ARRAY1 [@]!}"'されます違う。 – Cyrus

+0

$ {#array [@]} "で配列の要素の長さを取得します。 – Leon

答えて

1

コードは部分的に正しいです。問題は、!演算子で配列の指標を拡張しており、長さではなく、#演算子を使用していることです。

したがって、${array[@]}の両方の使用について暗黙的な連結に関する警告が発行されます。指標のリストは0 1 2 3 ...です。それにもかかわらず、長さが等しい2つの非連想型bash配列は同じインデックスリスト0 1 2 .. Nを持つため、コードは機能しています。

警告を取り除くには、${!array[@]}${#array[@]}に置き換える必要があります。もちろん、${!array[*]}を使用すると、警告が表示されなくなりますが、これはインデックスリストの比較を続けるので、ここでやりたいことではありません。

さらに読む:shellcheckの著者は、連結問題here in detailについて説明しました。

+0

*等しい長さを持つ2つの非関連のbash配列は同じインデックスリスト '0 1 2 .. N'を持ちます*インデックスの使用される値にギャップが存在する可能性があるので、これは一般的に真です。 '$ {#a [@]}'が3と評価される 'declare -aa = '([0] =" a "[1] =" b "[10] =" c ")' #a [@]} 'は' 0 1 10'です。 – Leon

0

Nyronium'sはうまく機能し、ソリューションを完全に説明しています。

ユーティリティの#が条件の配列長をチェックするという解決策も見つかりました。

申し訳ありません私は後でロジックをテストするために書いたので、このサンプルスクリプトは以前にはありませんでした。

#!/bin/bash 
array1=(1 2 3) 
array2=() 

echo "array1 length: ${#array1[@]}" #output :3 

for i in {1..10} ; do 
     echo "array2 length: ${#array2[@]}" 
     array2+=("$i") 

     #I want to exit when array2 = a length of 3 
     if [[ "${#array1[@]}" == "${#array2[@]}" ]] ; then 
       echo "exit" 
       break 
     fi 
done 

echo "final array1 length: ${#array1[@]} vs array2 length: ${#array1[@]}" 

結果:最終配列1の長さ:配列2の長さ対3:3

関連する問題