这个简单的shell脚本有什么问题

时间:2011-06-27 05:37:15

标签: bash shell

我是Shell脚本的新手。关于我写的一些脚本,只是有一个小问题。

pkgs="./cppcheck-1.48.tar.bz2 ./sshpass-1.04.tar.gz"
for pkg in $pkgs ; do
echo ${pkg} | grep -qE "bz2$"

if [ $? ] ; then
                echo "here1"
else
                echo "here2"            
fi

done

它总是在这里打印1,即条件总是为真。到目前为止,我无法确定任何理由。请指出我正确的方向。

我知道我可以使用shell的switch命令。只是想知道这有什么问题。 Shell是/ bin / bash

[编辑] - 开关语句完美无瑕。对于那些在其他时间遇到这个问题的人

case ${pkg} in
     *bz2) echo "here1";;
     *) echo "here2";;
esac

3 个答案:

答案 0 :(得分:4)

Bash有算术和条件表达式。

sarnold给出的答案是一种使用条件表达式强制执行此操作的方法,但如果您想使用算术表达式,则可以替换

[ $? ]

(( $? ))

如果您在bash手册页中搜索这些主题,则可以获得有关这些主题如何工作的更多信息。

编辑:我的错误,条件表达式是[[]]。 (())给出了你可能期望的行为。

答案 1 :(得分:3)

if [ $? ]无法正常工作:

$ false ; if [ $? ] ; then echo "true" ; else echo "false" ; fi 
true
$ true ; if [ $? ] ; then echo "true" ; else echo "false" ; fi 
true

通过明确地与0进行比较,很容易解决:

$ false ; if [ $? -eq 0 ] ; then echo "true" ; else echo "false" ; fi 
false
$ true ; if [ $? -eq 0 ] ; then echo "true" ; else echo "false" ; fi 
true

所以对于你的剧本:

pkgs="./cppcheck-1.48.tar.bz2 ./sshpass-1.04.tar.gz"
for pkg in $pkgs ; do
echo ${pkg} | grep -qE "bz2$"

if [ $? -eq 0 ] ; then
                echo "here1"
else
                echo "here2"            
fi

done

here1
here2

答案 2 :(得分:0)

echo ${pkg} | grep -qE "bz2$"替换为echo ${pkg} | grep -q -E "bz2$" 它会像魅力一样工作! [编辑] 糟糕..也将if()条件更改为 if [ $? -ne 1 ] ; then