【发布时间】:2018-06-01 07:39:05
【问题描述】:
我在我的 shell 脚本中使用了一个返回多个字符串的命令,每个字符串都包含在 "" 中。由于我需要将这些字符串中的每一个作为数组的单独元素,因此我使用" 作为分隔符来拆分这个字符串集合,如下所示:
IFS='"'
arr=($(command that returns multiple strings enclosed in ""))
现在,由于每个字符串的开头都有一个" 字符,我的脚本将每个字符串拆分为一个空白字符串和字符串本身。例如,字符串"foo" "bar" 将被拆分为(空字符串)、foo、(又是空字符串)和bar。所以我的数组最终有 4 个元素,而不是 2 个。
有两种方法可以克服这个问题,任何实现的帮助都会有所帮助:
- 在拆分时以某种方式摆脱了空白。
- 使用空格创建数组,然后创建另一个数组,仅将第一个数组中的非空格元素插入到第二个数组中。
我将答案标记为 bash 和 ksh,因为 bash 也可以接受。谢谢!
【问题讨论】:
-
arr=( $(...) )从一开始就是不好的做法。实际上,从来没有一个地方应该做某事。 -
如果你可以控制输出,你可以使用
eval arr=($(echo '"foo" "bar"'))。但是,这可能具有潜在危险,例如eval arr=($(echo '"foo" "$(echo dangerous)"'))。 ` -
(如果您想在分隔符上拆分单词,请考虑使用
IFS='"' read -r -a arr <<<"$string"代替——这样可以避免全局扩展。但是,它不是解析 shell 引用内容的正确工具)。