我的' []'是?,bash程序

时间:2014-07-15 01:23:42

标签: linux bash shell

在linux中,bash程序。 我写这个:

msg=`date  '+%m-%d %H:%M'`" alipay recharge [$sum] in past 15 mins"
echo $msg >> $MonitorLog

大部分都有效,但有时候。结果会是这样的:

07-15 09:01 card recharge 0 in past 30 mins

我的句子改变了。不是0,如果$ sum = 0,它应该是:

07-15 09:01 card recharge [0] in past 30 mins

我不知道我的'[]'在哪里?你能帮助我吗,非常感谢。

2 个答案:

答案 0 :(得分:6)

你正在进行shell globbing。请参阅下面的输出。

$ ls -l
total 4
-rw-r--r-- 1 root root 0 Jul 14 21:40 5
$ sum=10
$ msg=`date  '+%m-%d %H:%M'`" alipay recharge [$sum] in past 15 mins"
$ echo $msg
07-14 21:41 alipay recharge [10] in past 15 mins
$ sum=5
$ msg=`date  '+%m-%d %H:%M'`" alipay recharge [$sum] in past 15 mins"
$ echo $msg
07-14 21:41 alipay recharge 5 in past 15 mins
$ echo "$msg"
07-14 21:41 alipay recharge [5] in past 15 mins

答案 1 :(得分:2)

@Etan Reisinger's answer包含关键指针:

无意中将Shell扩展应用于$msg,因为未加引号

TL; DR:

双引号变量引用以保护它们免受shell的解释

echo "$msg" >> "$MonitorLog"    # due to double-quoting, contents of $msg used as is

一般来说,不引用变量引用的唯一理由是明确意图让shell 解释值(对其应用扩展) - 见下文


在目前的情况下,如果你不引用$msg,会发生什么:

通过空格(分词)将$msg的值拆分为后,路径名扩展将应用于每个:

即,每个看起来像glob(文件名模式)的单词都与文件名匹配 - 在指定的目录中,或者在没有路径组件的情况下,在当前的单词中匹配 - 如果找到匹配项,该单词由匹配的文件名替换。

诸如[0]之类的单词碰巧是有效的glob([...]包含匹配字符的;在这种情况下,该集仅由1组成char。,0),如果当前目录中出现名为0的文件,则[0] 将替换为匹配的文件名,{{ 1}} - 有效地使0消失 - 这就是OP案件中发生的事情 (请参阅[]man bash部分,了解有效整体的内容。)