我写了一个shell脚本来检测是否安装了包。如果安装了脚本,我的脚本应该写出它的名称和状态。我无法弄清楚我的代码是否存在任何问题但是当我运行它时,它并没有执行if [ $? == 0 ]
条件下的命令。
#!/bin/bash
if [ "$1" == "" ]; then
echo "Please hold the line."
else
dpkg -s $@ &> /dev/null
fi
if [ $? == 1 ]; then
echo -e "Package \033[0;31mNOT\033[0m found." >&2
else
if [ $? == 0 ]; then
for i in $@; do
dpkg -s $i | grep Package
dpkg -s $i | grep Status
done
fi
fi
但对我来说最奇怪的是,如果我在if语句之后添加一个echo,它就可以工作。看起来像这样:
#!/bin/bash
if [ "$1" == "" ]; then
echo "Please hold the line."
else
dpkg -s $@ &> /dev/null
fi
if [ $? == 1 ]; then
echo -e "Package \033[0;31mNOT\033[0m found." >&2
else
echo hi
if [ $? == 0 ]; then
for i in $@; do
dpkg -s $i | grep Package
dpkg -s $i | grep Status
done
fi
fi
因此,如果我在代码中将echo -n
添加到正确的位置,它将按我的意愿工作。但我只是想知道第一个出了什么问题?
答案 0 :(得分:2)
我认为一般来说,您可能会更加谨慎地对待返回代码处理。您正在假设$?
所指的内容可能无效,具体取决于您的程序流程,无论如何,使程序更难以阅读和理解。
#!/bin/bash
dpkg -s $@ &> /dev/null
installed=$?
if [ $installed -eq 0 ]; then
for i in $@; do
dpkg -s $i | grep Package
dpkg -s $i | grep Status
done
else
echo -e "Package \033[0;31mNOT\033[0m found." >&2
fi
答案 1 :(得分:1)
$?
是上次执行命令的返回状态。 0成功,1或其他任何错误。注意:
dpkg -s python &> /dev/null # returns 0 (OK, true)
# $? equals 0 now
[ #? == 1 ] # false # returns 1 (error)
# $? equals 1 now
[ #? == 0 ] # false # returns 1 (error)
当你输入回音时,它有效:
dpkg -s python &> /dev/null # returns 0 (OK, true)
# $? equals 0 now
[ #? == 1 ] # false # returns 1 (error)
# $? equals 1 now
echo hi # returns 0 (OK)
# $? equals 0 now
[ #? == 0 ] # true # returns 0 (OK)
您可以将$?
保存到变量中,但由于您已经检查了else
,因此只需将代码置于其他内容中,因此您不需要在#? == 1
内使用if:< / p>
#!/bin/bash
if [ "$1" == "" ]; then
echo "Please hold the line."
else
dpkg -s $@ &> /dev/null
fi
if [ $? == 1 ]; then
echo -e "Package \033[0;31mNOT\033[0m found." >&2
else
for i in $@; do
dpkg -s $i | grep Package
dpkg -s $i | grep Status
done
fi
如果您担心$?
(大于一)的其他可能的返回状态。您可以将脚本重写为
#!/bin/bash
if [ "$1" == "" ]; then
echo "Please hold the line."
else
dpkg -s $@ &> /dev/null
fi
if [ $? == 0 ]; then
for i in $@; do
dpkg -s $i | grep Package
dpkg -s $i | grep Status
done
else
echo -e "Package \033[0;31mNOT\033[0m found." >&2
fi