0

关于 Linux bash 中的 IFS 字符串拆分和单引号转义有很多已回答的问题,但我发现没有人加入这两个主题。偶然发现这个问题,我得到了一个奇怪的(对我来说)行为,代码如下所示:

(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 -ed 元素实际上包含我需要的子字符串(因此导致我认为\' 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"

我的电脑上的输出:

a string with some 
single
 quotes in it

查看更多 Bash 陷阱: http: //mywiki.wooledge.org/BashPitfalls

于 2014-03-03T12:14:32.670 回答