2011-06-27 129 views
1

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

[编辑] - switch语句完美无缺地工作。对于那些谁面对这个问题的一些其他时间

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

回答

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 
+0

感谢您的解释。 – Anon

4

Bash有算术和条件表达式。

答案sarnold给人是一种强制该使用条件表达式的工作,但如果你想使用算术表达式,而不是你可以用

(($?)) 

更换

[ $? ] 

如果您搜索这些主题的bash手册页,有更多关于这些工作的信息。

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

+0

谢谢。我真的很喜欢你的答案。指向我,我不知道的东西。高调:) – Anon

0

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