【问题标题】:Assigning a variable (with wildcard) with parentheses versus none用括号分配变量(带通配符)与无
【发布时间】:2016-09-23 20:28:34
【问题描述】:

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

我正在使用类似于以下语法的通配符分配一个变量:

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

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

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

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

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

谢谢!

【问题讨论】:

    标签: bash variables parentheses


    【解决方案1】:

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

    $ 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
    

    【讨论】:

      猜你喜欢
      • 2019-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-21
      • 2023-01-10
      • 1970-01-01
      • 2016-07-12
      相关资源
      最近更新 更多