在 shell 脚本中传递通配符以剪切命令并将其存储在变量中

2023-12-02

我是 shell 新手,有一种情况是我试图评估特定列的唯一值,以检查它们在稍后调用的 shell 脚本中是否有效。

从我的搜索来看,我认为剪切和排序和独特是很好的做法

所以我的尝试是

file=/filepath/*vendor.csv
file_categories = `cut -d, -f1 $file |sort |unique`

$file 应保存文件名中包含供应商的文件

但即使使用命令替换(`)后, $file 也没有被正确的文件名替换,它只是放置文件中存在的内容

我正在尝试的另一个例子是

a=/stage/scripts/vendor/*.out
echo $a
/stage/Scripts/ecommerce/oneclick/nohup.out /stage/Scripts/ecommerce/Vendor/Vendor_Automate_Ingestion_Process.out

wc-l

wc: /stage/Scripts/ecommerce/vendor/*.out:

$(wc -l "$a")
wc: /stage/Scripts/ecommerce/vendor/*.out:No such file or directory

我想了解如何在命令替换中传递通配符以及我可以采取哪些措施来纠正。


No, file将包含带有通配符的文字字符串。当您插入值时$file如果没有引号,那么 shell 将其评估为通配符。echo "$file"通过正确的引用可以显示变量的实际值。

没有好的方法可以将文件名列表存储在常规 shell 变量中。 Ksh 和其他一些 shell 有用于此目的的数组,但它不能移植回通用sh可能与你的不同actually需要,取决于您想要实现的最终目标。如果您想从文件中与通配符匹配的字段中提取唯一值到字符串中,只需确保作业中的等号周围没有空格即可。

file_categories=$(cut -d, -f1 $file | sort -u)
#              ^ no spaces around the equals sign!

将通配符存储在变量中是值得怀疑的;如果这是您要解决的问题,可能只需直接使用通配符即可。

到处都是你不去的地方具体来说如果希望 shell 扩展通配符并标记字符串,则需要在其两边加上双引号。

echo "$file_categories"

该字符串无法正确地被机器读取,因此将其捕获到变量中的用途非常有限。我敢打赌,你实际上只是想直接显示输出,而不是将其存储在变量中,这样你就可以echo它的价值:

cut -d, -f1 /filepath/*vendor.csv | sort -u

如果您想循环这些值,请将其进一步通过管道传递给while read -r ...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 shell 脚本中传递通配符以剪切命令并将其存储在变量中 的相关文章

随机推荐