在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
我不知道我的'[]'在哪里?你能帮助我吗,非常感谢。
答案 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
,因为未加引号 。
双引号变量引用以保护它们免受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
部分,了解有效整体的内容。)