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

时间:2018-05-21 11:02:01

标签: linux bash

我写了以下代码:

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    

1 个答案:

答案 0 :(得分:2)

是的!您可以通过将glob直接作为函数的参数传递来避免它。请注意,在传递给函数之前,glob会将结果展开。因此,将第一个参数作为要设置的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引用应用于变量/数组,除非您有理由不这样做。这样做可以保留内部内容的字面值,并防止发生Word-Splitting
  2. 始终对用户定义的变量/函数和数组名称使用小写名称