我有一个脚本sh startAWS.sh
。
最重要的是,我检查了这个:
if [[ `ps -acx|grep postgres|wc -l` < 1 ]]; then
echo "You need to start your Postgres service to run this script."
ps -acx|grep postgres|wc -l
exit 0
fi
我跑步时得到
⚡️ laravel sh startAWS.sh
You need to start your Postgres service to run this script.
6
嗯...什么... ♂️
我的Postgres正在运行,不应执行该回显。
它显示6
,并且6不小于1,则不应执行代码。
有人知道我为什么要回显打印吗?
答案 0 :(得分:1)
答案 1 :(得分:1)
这里有两个问题。
首先,正如@RameshNaidu指出的那样,res.status(404).render('404', { pageTitle: 'Page Not Found', path: 'Error'});
内部正在进行字符串比较(即字母顺序)而不是数字比较,这会造成麻烦。此错误导致的常见问题是字符串排序顺序与数字顺序不同-例如,[[ < ]]
的计算结果为true,因为字符排序顺序中“ 1”位于“ 2”之前。但这在这里不适用,因为“ 6”在排序顺序上也排在“ 1”之后。发生的事情比这更妙:[[ 10 < 2 ]]
在行数之前打印许多空格,而空格确实在“ 1”之前,因此wc -l
的计算结果为true。 / p>
第二,[[ " 6" < 1 ]]
是检查进程是否正在运行的一种不好方法,因为ps | grep something
命令(取决于确切的时间)可能在其输出中包含“ grep something”,而{ {1}}命令将与此匹配。如果您有ps
可用,请改用它,因为它可以自动避免此问题。另一个常见的解决方法是改用grep
-方括号可防止其自身匹配,因此您不会得到额外的匹配。
但是还有一种更简单的方法来查看是否存在匹配项:与其使用pgrep
来计算匹配项,不如使用grep "[s]omething"
(或wc
)来抑制输出,并且只需检查其退出状态即可(成功=找到至少一个匹配项,因此请用grep -q
对其进行否定以检查是否为否匹配项)。看起来像其中之一:
pgrep -q
或
!