2011-06-27 59 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