代码之家  ›  专栏  ›  技术社区  ›  Victoria Stuart

受数字编号的文件名和文件夹名影响的Bash命令

  •  0
  • Victoria Stuart  · 技术社区  · 7 年前

    发行

    我遇到过Linux命令在包含数字编号的文件和文件夹的文件夹中运行的问题;例如,顺序编号为1、2、3的文件。。。

    例如,如果我所在的文件夹中包含一个文件或文件夹,该文件或文件夹的数字名称出现在我的命令中,则该命令输出的输出可能会被截断。

    下面是一些例子:

    $ ls -l
    total 8
    drwxr-xr-x 2 victoria victoria 4096 May  7 18:34 1
    drwxr-xr-x 2 victoria victoria 4096 May  7 18:14 2
    -rw-r--r-- 1 victoria victoria    0 May  7 18:34 3
    
    ## fail
    $ a="[CPT1A] A Selective"; echo $a
    1 A Selective
    $ b="[CPT2A] A Selective"; echo $b
    2 A Selective
    $ c="[CPT3A] A Selective"; echo $c
    2 A Selective
    ...
    
    ## pass
    $ d="[CPT4A] A Selective"; echo $d
    [CPT4A] A Selective
    

    更新/解决方案

    ... 根据接受的答案:引用BASH变量(如果使用)。

    $ a="[CPT1A] A Selective"; echo $a
    1 A Selective
    $ a="[CPT1A] A Selective"; echo "$a"
    [CPT1A] A Selective
    
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   Gordon Davisson    7 年前

    问题是在使用变量时没有引用它——也就是说,使用 echo $a 而不是 echo "$a" . 当一个变量被引用时没有引号,它会被拆分成单词(所以“[CPT1A]a Selective”变成“[CPT1A]”“a”“Selective”),然后每个包含类似文件名通配符的单词都会被扩展成匹配文件名的列表。

    方括号表达式,如 [CPT1A] 实际上是有效的通配符表达式,可以匹配其中的任何单个字符,因此如果存在名为“A”、“C”、“P”、“T”或“1”的文件,则会扩展到匹配的名称如果没有,通配符表达式将完整地传递。

    解决方案:双引号变量引用以避免这样的意外命令替换也一样 $( ) (或者反勾,但不要用那些)。有一些地方可以安全地将它们关闭,比如在直接任务中,但是在IMO中,在任何地方使用它们都比跟踪异常情况更安全。例如, a=$b 好吧,不过也一样 a="$b" . 另一方面, export a=$b 可能工作,也可能不工作(取决于您使用的shell),但是 export a="$b" 工作。

    顺便说一句, shellcheck.net 善于指出这些(以及其他一些常见的错误)。

    推荐文章