使用括号与 none 分配变量(使用通配符)
Assigning a variable (with wildcard) with parentheses versus none
我有一个简单天真的问题,我已经想出了如何制作我的脚本 运行 但我想知道为什么它以前不起作用。
我使用类似于以下语法的通配符分配变量:
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
中仍然有 *
。这是因为pathname expansion没有进行变量赋值。因此,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
我有一个简单天真的问题,我已经想出了如何制作我的脚本 运行 但我想知道为什么它以前不起作用。
我使用类似于以下语法的通配符分配变量:
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
中仍然有 *
。这是因为pathname expansion没有进行变量赋值。因此,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