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