配列宣言:二重引用符と角括弧

配列宣言:二重引用符と角括弧

たぶんこれは愚かな質問かもしれませんが、2時間インターネット検索をしても意味のある結果が出ませんでした。

簡単に言えば、Bashには次の違いがあります。

X="
a
b
c
"

そして

X=(
a
b
c
)

前者は変数の定義に従い、後者は配列の定義に従う。

配列は多要素変数なので、前者もすべての目的のための配列です。

前者が配列の場合(a)二重引用符と(b)角括弧の唯一の動作上の違いは、配列要素の引用規則の動作ですか?

どんな洞察力でもいただきありがとうございます。

答え1

いいえ、前者は配列ではありません。

たとえば、インデックスを使用してメンバーを選択することはできません。

arr=(a b c)
echo "${arr[1]}"  # b

配列を使用してパラメータを渡すことはできますが、文字列は渡すことはできません。より良い結果を得るには、スペースを含む要素を使用してください。

arr=(a 'b c' d)
printf '(%s)\n' "${arr[@]}"

string=$'\nm\nn o\np\n'
printf '(%s)\n' $string

出力:

(a)
(b c)
(d)
(m)
(n)
(o)
(p)

man bash2つの変数タイプの説明が含まれており、インターネット検索は必要ありません。

答え2

改行で区切られた部分文字列で構成される文字列は、文字列配列と同じではありません。 1つは文字列で、もう1つは文字列を含みます。

文字列に改行文字を含む文字列を複数行に分割するという事実は、文字列の格納に特別​​な意味がありません。シェルは行にインデックスを付けることはできず、単一行には何らかの方法でエンコードせずに挿入された改行文字を含めることはできません。

配列は、個々の文字列の順序付けられたセットです。各文字列は配列のインデックスを介してすぐにアクセスできます。単一の配列要素には、改行やその他の区切り文字の有無にかかわらず、標準の文字列を含めることができます(シェルのnul文字を除くbash)。ただし、bash多次元配列はサポートされていないため、配列要素は他の配列にすることはできません。

string1='Hello World'

string2="'Twas brillig, and the slithy toves
      Did gyre and gimble in the wabe:
All mimsy were the borogoves,
      And the mome raths outgrabe."

array=( "$string1" "$string2" )

printf '%s\n' "${array[1]}"

上記のスクリプトは、Lewis Carrollの詩「Jabberwocky」の最初の詩を印刷します。Hello World配列の最初の要素ではなく2番目の要素を出力することを選択したため、印刷されません。 2番目の要素は単一の文字列です。これらの文字のいくつかは改行文字と空白文字ですが、これはデモ用です。

2番目の配列要素の詩から1行または他の部分文字列を出力するには、文字列を解析するユーティリティを使用する必要があります。文字列から改行で区切られた単一の部分文字列を抽出することは、シェルの配列概念とは何の関係もありません。

関連情報