gpt4 book ai didi

linux - 避免在 bash 中使用数组进行通配符扩展

转载 作者:太空狗 更新时间:2023-10-29 12:09:35 25 4
gpt4 key购买 nike

我写了下面的代码:

join(){
IFS="$1"
shift
echo "$*"
}

FILES=(/tmp/*)
SEPARATED_FILES=$(join , ${FILES[*]})
echo $VAR

它在 /tmp 中打印逗号分隔的文件列表就好了。但我想重构它并消除 tmp 全局变量 FILES 这是一个数组。我尝试了以下方法:

SEPARATED_FILES=$(join , ${(/tmp/*)[*]})
echo $VAR

但它打印出以下错误:

line 8: ${(/tmp/*)[*]}: bad substitution    

最佳答案

是的!您可以通过将 glob 作为参数直接传递给函数来避免它。请注意,glob 结果在传递给函数之前由 shell 扩展。因此,将第一个参数作为您要设置的 IFS 传递,将第二个参数作为您要使用的 glob 表达式传递。

join , /tmp/*

在调用函数之前,glob 被扩展为文件名。

join , /tmp/file1 /tmp/file2 /tmp/file3

一个值得注意的补充是在调用函数之前使用 nullglob 选项。因为当 glob 不产生任何结果时,可以安全地忽略未展开的字符串。

shopt -s nullglob
join , /tmp/*

在命令替换语法中为

fileList=$(shopt -s nullglob; join , /tmp/*)

从您的努力中得到的一些收获。

  1. 除非有理由不这样做,否则始终对变量/数组应用 shell 引用。这样做可以保留内部内容的字面值并防止发生分词
  2. 始终对用户定义的变量/函数和数组名称使用小写名称

关于linux - 避免在 bash 中使用数组进行通配符扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50447450/

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