我在shell脚本中使用一个命令,它返回多个字符串,每个字符串都包含在""
中。由于我需要将每个字符串作为数组的单独元素,因此我使用"
作为分隔符来拆分此字符串集合,如下所示:
IFS='"'
arr=($(command that returns multiple strings enclosed in ""))
现在,由于每个字符串的开头都有一个"
字符,我的脚本会将每个字符串拆分为一个空字符串和字符串本身。例如,字符串"foo" "bar"
将分为(空字符串),
foo
,(再次为空字符串)和
bar
。所以我的数组最终有4个元素,而不是2个。
有两种方法可以解决这个问题,任何实施方面的帮助都会有所帮助:
我正在标记答案,因为bash和ksh作为解决方案,bash也是可以接受的。谢谢!
答案 0 :(得分:2)
除非引用的字符串包含换行符,否则您可以使用xargs
将引用的字符串处理为NUL分隔的单词列表:
array=( )
while IFS= read -r -d '' piece; do
array+=( "$piece" )
done < <(command-that-returns-multiple-quoted-strings | xargs printf '%s\0')
如果您要拆分的引用字符串执行包含换行符,xargs
将无法正常工作;请考虑使用Python标准库shlex
module:
shell_quotes_to_NULs() {
python -c '
import sys, shlex
for piece in shlex.split(sys.stdin.read()):
sys.stdout.write(piece)
sys.stdout.write("\0")
'
}
array=( )
while IFS= read -r -d '' piece; do
array+=( "$piece" )
done < <(command-that-returns-multiple-quoted-strings | shell_quotes_to_NULs)
答案 1 :(得分:1)
如果您想用双引号存储字符串并忽略其余部分,这里有一个正确处理awk
的{{1}}解决方案:
<newline>
使用arr=();
while IFS= read -r -d '' item; do
arr+=("$item");
done < <(cmd | gawk -v RS='"[^"]*"' 'RT { gsub("\"", "", RT); printf RT"\0"}');
4.4或更高版本:
bash