用于检测系统

时间:2015-10-31 20:17:07

标签: linux bash shell dpkg

我写了一个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添加到正确的位置,它将按我的意愿工作。但我只是想知道第一个出了什么问题?

2 个答案:

答案 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