書式設定、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}
$cws
11
11
$ echo ${#cws}
2
これが配列の長さを指定する理由です[@]
。以下を覚えておいてください。
$ echo ${#cws[@]}
3
答え2
問題は配列を参照する方法です。スタート:
$ declare -a cw=(11 2 8 7 6 5 4 3 6 0)
それでは、長さを2つの異なる方法で見てみましょう。
$ echo ${#cw}
2
$ echo ${#cw[@]}
10
最初のメソッドは、インデックス0(この場合は最初の要素でもあるcw
)の要素の長さを返します。対照的に、2番目の方法は配列の要素数を返します。
もっと
質問には次のコードがあります。
widths=($(11 2 8 7 6 5 4 3 6 0));
11
このコードはパラメータを使用してコマンドを実行しようとします2 8 7 6 5 4 3 6 0
。結果は、名前付きコマンドが存在するかどうかによって異なります11
。そうでない場合は、以下が表示されます。
bash: 11: command not found