0

Linux bash での IFS 文字列の分割と一重引用符のエスケープに関する多くの質問への回答がありますが、2 つのトピックを結合するものは見つかりませんでした。問題に遭遇すると、以下のようなコードで(私にとって)奇妙な動作が発生しました。

(bash スクリプト ブロック)

theString="a string with some 'single' quotes in it"

old_IFS=$IFS
IFS=\'
read -a stringTokens <<< "$theString"
IFS=$old_IFS

for token in ${stringTokens[@]}
do
    echo $token
done

# let's say $i holds the piece of string between quotes
echo ${stringTokens[$i]}

何が起こるかというと、配列のecho要素には実際に必要な部分文字列が含まれているため (したがって、\' IFS が正しいと思われます)、forループはスペースで分割された文字列を返します。

同じ配列 (または私の考えでは同じ配列のように見えるもの) がこのように動作する理由を誰かが理解するのを親切に手伝ってくれますか?

4

1 に答える 1

1

あなたがするとき:

for token in ${stringTokens[@]}

ループは実質的に次のようになります。

for token in a string with some single quotes in it

for ループは配列を要素ごとに解析しませんが、スペースで区切られた文字列の出力全体を解析します。

代わりに試してください:

for token in "${stringTokens[@]}";
do
   echo "$token"
done

これは次と同等です。

for token in "in a string with some " "single" " quotes in it"

私のPCでの出力:

a string with some 
single
 quotes in it

その他の Bash の落とし穴については、こちらをご覧ください: http://mywiki.wooledge.org/BashPitfalls

于 2014-03-03T12:14:32.670 に答える