无缘无故的 shell 脚本问题

3

我有两个完全相同的Ubuntu 12.04 LTS系统。今天,一个shell脚本在其中一个Ubuntu系统上失败了,即使这个脚本多年没有修改过,在几小时前还能正常工作。我已经能够缩小错误范围:

string='question mark: ?'
echo $string
question mark: n t

string='question mark: ?'
echo "$string"
question mark: ?

在脚本失败的系统上,当省略引号时,'?'会被替换为'n t'。在另一个相同的系统上进行相同的测试,结果如下:
string='question mark: ?'
echo $string
question mark: ?

string='question mark: ?'
echo "$string"
question mark: ?

在这个系统上,无论是否省略引号,问号都能正确打印。
这个shell脚本多年来一直没有被修改过,系统也没有进行任何升级或修改。几小时前,这个shell脚本还能正常工作,但突然间出现了'?'被转换成'n t'的问题,原因不明。
我因为这个问题而烦恼不已,所以真的希望有人能想出这是为什么。
谢谢。
1个回答

8
这是因为您的工作目录中有文件nt?将被任何一个字符文件替换。
$ ls
a  t myfile

$ echo $string
question mark: a t

为了解决这个问题,在使用 echo 时,请将变量用双引号括起来:
$ echo "$string"
question mark: ?

一般来说,正如devnull为什么bash中的“echo [t]”结果是“t”而不是“[t]”评论中所述:

Shell Command Language tells that the following characters are special to the shell depending upon the context:

*   ?   [   #   ~   =   %

Moreover, following characters must be quoted if they are to represent themselves:

|  &  ;  <  >  (  )  $  `  \  "  '  <space>  <tab>  <newline>
所以举个例子,使用*可以获取所有文件:
$ string='question mark: *'

$ echo $string
question mark: a myfile t

1
我无法感谢你们的足够。这就是问题的原因。几个小时前,我在我的主目录下创建了两个名为“n”和“t”的文件夹。现在是时候学习特殊字符以避免将来出现这样的问题了。 - user3611207
1
一般情况下,您应该使用双引号引用任何 shell 变量的使用,就这样。只有在您想要像您遇到的那些效果的罕见情况下,才可以省略引号;我通常会注释这些情况以解释为什么引号被省略了。 - Alfe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接