分配带括号的变量(带通配符)与无



我有一个简单的幼稚问题,我已经想出了如何让我的脚本运行,但我想知道为什么它以前不起作用。

我使用类似于以下内容的语法为一个带有通配符的变量分配:

var=$dir/$subj/name*text*text.nii.gz

我可以用 ls $file 调用正确的文件名,但是当我尝试将 $file 替换为命令行的输入(使用 FSL 进行图像处理)时,我收到一个错误,说它找不到带有通配符的文件。

但是,当我用括号分配变量时:

var=($dir/$subj/name*text*text.nii.gz)

它运行得很好。我假设还有其他可能更好的方法来做到这一点,但我只是想知道为什么初始变量赋值不起作用,以及以这种方式分配变量的最佳方法是什么。

谢谢!

让我们考虑一个包含三个文件的目录:

$ ls
file1  file2  file3

现在定义一个变量:

$ var=file*

我们可以使用declare -p看到var的内容:

$ declare -p var
declare -- var="file*"

如您所见,var仍然包含*。 这是因为不对变量赋值执行路径名扩展。 因此,var并不总是如您所愿地工作。 例如:

$ ls "$var"
ls: cannot access file*: No such file or directory

接下来,让我们尝试创建一个数组:

$ var=(file*)
$ declare -p var
declare -a var='([0]="file1" [1]="file2" [2]="file3")'

如您所见,路径名扩展是在数组上执行的。 因此,以下方法确实有效:

$ ls "$var"
file1

但是,请注意,对于数组,$var仅引用第一个元素。 如果要访问其所有条目,则需要更复杂的表示法:

$ ls "${var[@]}"
file1  file2  file3

相关内容

  • 没有找到相关文章

最新更新