たぶんこれは愚かな質問かもしれませんが、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 bash
2つの変数タイプの説明が含まれており、インターネット検索は必要ありません。
答え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行または他の部分文字列を出力するには、文字列を解析するユーティリティを使用する必要があります。文字列から改行で区切られた単一の部分文字列を抽出することは、シェルの配列概念とは何の関係もありません。