【发布时间】:2019-02-04 16:36:39
【问题描述】:
问题: 编写一个 bash 脚本,我正在尝试将 csv 文件中的产品列表导入数组:
#!/bin/bash
PRODUCTS=(`csvprintf -f "/home/test/data/input.csv" -x | grep "col2" | sed 's/<col2>//g' | sed 's/<\/col2>//g' | sed -n '1!p' | sed '$ d' | sed 's/ //g'`)
echo ${PRODUCTS[@]}
在交互式 shell 中,结果/输出看起来很完美,如下所示:
burger
special fries
juice - 300ml
当我在 bash 脚本中使用完全相同的命令时,即使使用 bash -x script.sh 进行调试,在 echo ${PRODUCTS[@]} 的部分中,数组的结果是 位于 /home/test/data/ 的所有文件名 和:
burger
special
fries
juice
-
300ml
该数组正在获取目录列表并弄乱了换行符。这不会发生在交互式 shell(单个命令行)中。 有谁知道如何解决这个问题?
【问题讨论】:
-
由于你没有引用
${PRODUCTS[@]},它会受到分词和全局扩展的影响。不过,不确定-x有什么不同。 -
当你说“交互式shell”时,那只是命令的输出(
csvprint ... sed ...)吗? -
是的,它是在 shell 中输入单行命令时的输出。不在脚本文件中。
-
ShellCheck 建议使用
mapfileinstead of word splitting 和quote all expansions -
我可以看到它在交互式 shell 中以您声称的方式工作的唯一方法是,如果您设置
IFS=而不记得或告诉我们。