shell脚本没问题的问题

时间:2014-05-07 08:10:35

标签: bash ubuntu-12.04

我有两个相同的Ubuntu 12.04 LTS系统。今天,一个shell脚本在其中一个Ubuntu系统上失败,即使它已经多年未被修改,并且几个小时前就已经开始工作了。我能够将错误缩小到这个:

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

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

在shell脚本失败的系统上,'?'替换为' n'当引号被省略时。这是对另一个相同系统进行相同测试的结果:

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

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

在此系统上,无论是否省略引号,都会正确打印问号。

shell脚本多年未被修改,系统尚未以任何方式升级或修改。 shell脚本在几小时前工作正常,但由于'?'突然失败了。由于没有明显的原因,它被转换为' n'

我因此而疯狂,所以我真的希望有人知道为什么会这样。

感谢。

1 个答案:

答案 0 :(得分:8)

这是因为您的工作目录中有nt个文件。 ?被任何带有一个字符的文件替换。

$ ls
a  t myfile

$ echo $string
question mark: a t

要解决此问题,请在echo

时双引号变量
$ echo "$string"
question mark: ?

通常,devnull中的Why does bash “echo [t]” result in “t” not “[t]”条评论:

  

Shell Command Language   告诉我们以下字符对于shell来说是特殊的   根据具体情况:

*   ?   [   #   ~   =   %
     

此外,如果要表示以下字符,则必须引用它们   本身:

|  &  ;  <  >  (  )  $  `  \  "  '  <space>  <tab>  <newline>

例如,使用*可以获得所有文件:

$ string='question mark: *'

$ echo $string
question mark: a myfile t