Dan*_*cht 1 variables bash parentheses
我有一个简单的天真问题,我已经弄清楚如何让我的脚本运行,但我想知道为什么它以前没有用.
我使用类似于以下语法的通配符分配变量:
var=$dir/$subj/name*text*text.nii.gz
我可以使用ls $文件调用正确的文件名,但是当我尝试用$ file替换为命令行的输入(使用FSL进行图像处理)时,我得到一个错误,说它无法找到带有通配符的文件地点.
但是,当我用括号分配变量时:
var=($dir/$subj/name*text*text.nii.gz)
它运行得很好.我假设有其他可能更好的方法来做到这一点,但我只是想知道为什么初始变量赋值不起作用,以及以这种方式分配变量的最佳方式是什么.
谢谢!
让我们考虑一个包含三个文件的目录:
$ ls
file1 file2 file3
Run Code Online (Sandbox Code Playgroud)
现在定义一个变量:
$ var=file*
Run Code Online (Sandbox Code Playgroud)
我们可以看到var
使用的内容declare -p
:
$ declare -p var
declare -- var="file*"
Run Code Online (Sandbox Code Playgroud)
如你所见,var
仍然有*
它.这是因为不对变量赋值执行路径名扩展.因此,var
并不总是像你想要的那样工作.例如:
$ ls "$var"
ls: cannot access file*: No such file or directory
Run Code Online (Sandbox Code Playgroud)
接下来,让我们尝试创建一个数组:
$ var=(file*)
$ declare -p var
declare -a var='([0]="file1" [1]="file2" [2]="file3")'
Run Code Online (Sandbox Code Playgroud)
如您所见,路径名扩展是在阵列上执行的.因此,以下工作正常:
$ ls "$var"
file1
Run Code Online (Sandbox Code Playgroud)
但是,请注意,对于数组,$var
仅指第一个元素.如果要访问其所有条目,则需要更复杂的表示法:
$ ls "${var[@]}"
file1 file2 file3
Run Code Online (Sandbox Code Playgroud)