问题
我一直在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
答案 0 :(得分:3)
问题在于,使用变量时没有引用该变量-也就是说,您使用的是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善于指出这些问题(以及其他一些常见错误)。