由于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的双引号?
答案 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程序完成,因为它太复杂了。