Bash脚本在重新启动时给我一个不同的结果?

Bash脚本在重新启动时给我一个不同的结果?,bash,ubuntu,reboot,Bash,Ubuntu,Reboot,我在最后一天左右编写了一个Bash脚本,并直接在shell上运行和调试它。 最后的脚本将在Ubuntu服务器重新启动时执行 我已经开始测试这个,但是我的脚本给了我一个不同于预期的结果。 我已将其缩小为“或条件”,并重写了一个更简单的脚本来测试此异常: 已在/etc/rc.local中调用此脚本,并将输出重定向到日志文件(log/reboot.log) 我的脚本中有以下内容(作为测试): 在shell中执行我得到的“是相等的”(正确答案)。在日志中重新启动后,我得到“不相等”。 有人能告诉我为什么

我在最后一天左右编写了一个Bash脚本,并直接在shell上运行和调试它。
最后的脚本将在Ubuntu服务器重新启动时执行
我已经开始测试这个,但是我的脚本给了我一个不同于预期的结果。 我已将其缩小为“或条件”,并重写了一个更简单的脚本来测试此异常:

已在/etc/rc.local中调用此脚本,并将输出重定向到日志文件(log/reboot.log)

我的脚本中有以下内容(作为测试):

在shell中执行我得到的“是相等的”(正确答案)。在日志中重新启动后,我得到“不相等”。

有人能告诉我为什么吗?
我在这里猜

但是你意识到你的
/bin/sh
不是你的
外壳吗。
在UBUNTU和Debian中,
/bin/sh
是DASH,您的登录shell是BASH。 因此,它可能与BASH的
[[]]
语法有关

你在剧本的顶部写对了吗:

#!/bin/sh

[[

[[builtin]是一种巴什主义,具有更好的语义定义 比[(又称测试)。然而,使用它仍然是相当合理的[ 相反,和可移植脚本必须这样做 不完全相同;如上所述,使用=而不是==

请看这里:

在这里做事的正确方法

最好的解决办法是把你的脚本放在<代码> /ETC/init .d/c>中,并将它链接到运行级别6。这是重新启动时执行的运行级别。当你有空闲时间时,你应该考虑阅读<代码> man 8 init < />代码。这将有助于你理解系统是如何启动和关闭的。ng行。你确定是

bash
运行了输出不正确的脚本吗?
rc.local
不是由
sh
执行的吗?尝试将
bash
中的所有内容包装为:
bash-c'beday=20131103;SYS_DATE=20131104;如果[$LAST_START=$beday | LAST_START=$SYS_DATE]];那么echo“是相等的”;否则echo是相等的“不平等";fi'
,它应该可以工作。什么工作是强制脚本在bash中运行。所以我的脚本调用/etc/rc.local看起来像:bash/mnt/ETLModule2/scripts/rs-reboot.sh/mnt/ETLModule2/>/mnt/ETLModule2/log/reboot date+'%s'。log我应该继续在bash中开发还是使用更标准的POSIX脚本编写方式?感谢您的帮助像这样,限制你自己的POSIX剧目并不是一个严重的限制。如果你发现自己渴望数组等,可能会考虑切换到BASH(或者脚本语言,比如Python)。。感谢您的帮助,Oz123,忘了在我指定的脚本顶部提到#!/bin/bash@Alain,我为你添加了shebang。你确定你是作为BASH运行的吗?观察得很好。但是,是的,我刚刚再次检查了它。你能详细说明一下“the/bin/sh不是你的SHELL”吗?system shell和login shell之间有什么区别?@Alain,很简单。打开终端时使用的shell就是登录shell。在Debian及其衍生产品中,决定由DASH执行init脚本。一个原因是它更快。第二个原因是它的语法更简单。
#!/bin/sh
#!/bin/bash