linux shell脚本:忽略IFS的双引号

时间:2011-10-14 06:43:49

标签: bash

由于IFS的默认值,我得到以下结果。

STR="this is a \"valid string\""
for a in $STR; do
  echo $a;
done

将输出为:

this
is
a
"valid
string"

但我不想拆分“有效字符串”。 我需要输出:

this
is
a
"valid string"

那么,我怎样才能让shell忽略来自IFS的双引号?

2 个答案:

答案 0 :(得分:2)

有两种类型的引号:文字引号和句法引号。 STR的外引号是句法的,这意味着它们实际上不是字符串的一部分,它们只是用于告诉Bash字符串的开始和结束位置。内部(转义)引号是文字的,因此它们是字符串的一部分。换句话说,字符串的 literal 值为:

this is a "valid string"

现在,如果你想循环这个,你必须记住这个字符串由五个(空格分隔的)文字组成:

this
is
a
"valid
string"

如果你想解决这个问题,你可以使用eval(但要注意严重的security issues)或数组:

declare -a STR=(this is a "valid string")
for str in "${STR[@]}"
do
    echo "$str"
done

答案 1 :(得分:0)

这不容易。你可以改用Perl。或者,如果您完全控制字符串,并且没有人可能在其中插入邪恶内容,您可以使用此代码:

str="a b c \"d e\""
eval "set args $str; shift"

for i in "$@"; do
  echo "$i"
done

但是这将输出没有引号的最后一个单词。它会将命令lune参数覆盖到shell程序本身。

如果你需要保留引号,这称为解析,不应该由shell程序完成,因为它太复杂了。