Bash配列 - 動作しません

Bash配列 - 動作しません

書式設定、xargsの使用、データをスクリプトに渡す方法などを扱い、配列の作成に問題があります。

alias lstest='ls | xargs --delimiter="\n" ~/.config/lsdif_color.sh'

for fileLine in "$@"
do
    if [[ $fileLine == total* ]]; then echo $fileLine;
    else 
        cols=($fileLine);
        echo ${#cols}, $l
        echo ${cols[0]}
        echo ${cols[$(( ${#cols}-1 ))]}
    fi;
done 

だからこれは素晴らしい作品です。 "cols"配列は正しい長さを示し、最初と最後の要素が完全に出力されます。

今質問は次のとおりです。

...
else
  # Method 1
  declare -a cw=(11 2 8 7 6 5 4 3 6 0);
  echo ${#cw}

  # Method 2
  widths=($(11 2 8 7 6 5 4 3 6 0));
  echo ${#widths}

  #Method 3
  cws[0]="11"
  cws[1]="2"
  cws[3]="8"
  cws[4]="7"
  cws[5]="6"
  cws[6]="5"
  cws[7]="4"
  cws[8]="3"
  cws[9]="6"
  cws[10]="0"

  echo ${#cws}

fi;

これらの配列を定義する3つの方法すべてでは、エコー長は常に2です。 10の代わりに。上記のCols配列には10個の要素がリストされていますが、数値配列を作成しようとすると文字列を作成しても失敗します。

なぜ?

Jaeden "Sifo Dyas" al Raec Ruinerに感謝します。

ベストアンサー1

以下を使用できます。

echo {#cws[@]}
  • {#cws}通常、文字列の長さを返すために使用されます。
  • [@]これがなければ、値は$cws配列全体ではありませんが、デフォルトは配列値の最初の要素(別名)になるため重要です。$cws[0]

たとえば、コマンドプロンプトで次のような3つの単純な要素配列を作成できます。

$ cws[0]="11"; cws[1]="2"; cws[3]="8"

次の言葉を引用すると、何が起こるかを見てください$cws

$ echo $cws
11

したがって bash 拡張を使用して何かの長さを決定するとき{#... }、そうでない場合、 is と[@]書いて bash に「11 の長さはいくらですか?」と尋ねます。もちろん、bashは2つの文字を含む文字列をチェックするので、Bashは「ああ、それは2です」と言います。${#cws}$cws1111

$ echo ${#cws}
2

これが配列の長さを指定する理由です[@]。以下を覚えておいてください。

$ echo ${#cws[@]}
3

おすすめ記事