2017-04-06 6 views
0

${#arrayname[@]}を実行すると、bashで配列の長さを取得できることがわかります。

私の質問は、私が覚えなければならないことか、この構文を分かりやすい部分に分解できますか?たとえば、@というシンボルは、インデックスの検索場所を意味していますか?なぜ#

答えて

5

#を行うことによって得ることができる取得することを意味し変数の値の長さ。通常の変数の場合は、文字の長さを意味します。 #は「数字」の記号なので、これは「変数の中のものの数」を意味しています。

@または*は、特定の要素ではなく配列全体を使用することを意味し、文字数を返す代わりに配列要素の数を返します。 *は多くのコンテキストでワイルドカードとして使用されるため、これは覚えやすいはずです。また、$*[email protected]は、シェルスクリプトへのすべての引数を意味するため、すべての配列要素との並列性が明白である必要があります。

あなたは添字なし配列変数を使用する場合、それは配列の要素0と同等ですので、あなただけの${#arrayname}を書き込むことはできません。したがって、${#arrayname}${#arrayname[0]}と同じです。これは、配列の最初の要素の文字数です。

+0

これは役に立ちます - ありがとう! –

1

は文字とパラメータの値のNOTバイトの数で長さを返したいのbashを語っています。

myString="Hello StackOverflow!" 
printf "%s\n" "${#myString}" 
20 

しかし、アレイの、この拡張タイプは、2つの意味があります個々の要素について

  1. を、それが(すべての「正常」パラメータのような)要素 の文字列の長さを報告
  2. について質量添字@*それ は、アレイ内の組の要素の数を報告

myArray=(1 2 3 4 15) 
printf "%s\n" "${myArray[@]}" # <-- Gives me list of elements 
1 
2 
3 
4 
15 
printf "%s\n" "${#myArray[@]}" # <-- Gives me number of elements 
5 

それは今面白い、配列の上に例を考えてみましょう、最後の要素2の長さは、変数の参照の先頭に

printf "%s\n" "${#myArray[4]}" 
2 
4

覚えておいてください。 :) #は通常の番号を意味します。例えば

  • $#からarr
  • ${#arr}配列の長さ(要素の数) - - 第1要素の長さの文字列$str
  • ${#arr[@]}"の長さ - 引数
  • ${#str}の数であります配列の(strのように)

残念ながら、${parameter#word}または${parameter##word}には、の数字はありません。です。 (。それは

parameterの初めから word最短/最長を削除し、また、 # ....はコメントです;)

関連する問題