gpt4 book ai didi

arrays - Bash、数组和空格的奇怪行为

转载 作者:太空宇宙 更新时间:2023-11-04 12:01:55 25 4
gpt4 key购买 nike

问题:编写 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 脚本中使用完全相同的命令时,甚至在 echo ${PRODUCTS[@]} 部分使用 bash -x script.sh 进行调试,数组的结果是位于/home/test/data/的所有文件名和:

burger
special
fries
juice
-
300ml

该数组采用目录列表并弄乱了换行符。这不会发生在交互式 shell(单个命令行)中。有人知道如何解决这个问题吗?

最佳答案

查看 csvprintf 的文档,您正在将 csv 转换为 XML,然后使用正则表达式对其进行解析。这通常是一个非常糟糕的主意。

您可能想要安装 csvkit那么你可以做

csvcut -c prod input.csv | sed 1d

或者您可以使用 CSV 解析器模块附带的语言。比如 ruby

ruby -rcsv -e 'CSV.read("input.csv", :headers=>true).each {|row| puts row["prod"]}'

无论您使用哪种方法,使用此构造将结果读入 bash 数组

mapfile -t products < <(command to extract the product data)

然后,打印数组元素:

for prod in "${products[@]}"; do echo "$prod"; done
# or
printf "%s\n" "${products[@]}"

数组扩展周围的引号很关键。如果缺失,您将看到每行一个单词。


提示:不要在 shell 中使用 ALLCAPS 变量名:将那些保留给 shell。有一天你会写 PATH=something 然后想知道为什么你的脚本被破坏了。

关于arrays - Bash、数组和空格的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52085057/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com