将wildcard传递给shell脚本中的cut命令并将其存储在变量中

时间:2018-01-19 11:20:35

标签: bash shell ksh glob cut

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

从我的搜索中我认为与sort&独一无二是好事

所以我的尝试是

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

我想了解我们如何在命令替换中传递狂野角色以及我可以做些什么来纠正。

2 个答案:

答案 0 :(得分:2)

不,file将包含带通配符的文字字符串。当你在没有引号的情况下插入值$file时,当shell将其作为通配符进行评估时。 echo "$file"使用适当的引号显示变量的实际值。

没有好的方法可以在常规shell变量中存储文件名列表。为此目的,Ksh和其他一些shell都有数组,但是它不能移植回通用sh并且可能不是你实际需要的东西,这取决于最终的目标你想要完成。如果要从匹配通配符的文件中的字段中提取唯一值到字符串中,请确保在分配中的等号周围没有空格并且您已完成。

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 ...

答案 1 :(得分:1)

为了使wc -l命令有效,请将其命名为:

wc -l $a

不引用a变量,shell需要将其展开以读取其*通配符值