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

Linux 避免在bash中使用数组进行通配符扩展,linux,bash,Linux,Bash,我编写了以下代码: join(){ IFS="$1" shift echo "$*" } FILES=(/tmp/*) SEPARATED_FILES=$(join , ${FILES[*]}) echo $VAR 它可以很好地打印/tmp中以逗号分隔的文件列表。但是我想重构它并消除tmp全局变量FILES,它是一个数组。我尝试了以下方法: SEPARATED_FILES=$(join , ${(/tmp/*)[*]}) echo $VAR

我编写了以下代码:

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/*)

从你的努力中得到的几点收获

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