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

pass wildcard to cut command in shell script and store it in a variable

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

根据我的搜索,我认为 cut along with sort & unique 是很好的做法

所以我的尝试是

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

$file 应该包含文件名中有 vendor 的文件

但即使在使用命令替换 (`) 之后,$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

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

不,file 将包含带通配符的文字字符串。当您插入值 $file 时不带引号,那是 shell 将其评估为通配符的时候。 echo "$file" 通过适当的引号显示变量的实际值。

没有好的方法可以在常规 shell 变量中存储文件名列表。 Ksh 和其他一些 shells 有用于此目的的数组,但它不能移植回通用 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 ...

为了使您的 wc -l 命令生效,请这样调用它:

wc -l $a

不要引用 a 变量,shell 需要扩展它来读取它的 * 通配符值