2011-06-27 3 views
1

シェルスクリプトが初めてです。私が書いたスクリプトについて少し質問があります。この単純なシェルスクリプトで何が問題になっています

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 

常にここでは、条件が常にtrueの場合は常に1が出力されます。私は今までそれを何らかの理由で指摘することはできません。私を正しい方向に向けてください。

シェルのスイッチコマンドを使うことができます。これで間違っていることを知りたいだけです。シェルは/ 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のmanページで検索してください。

編集:私の間違い、条件式は[[]]です。 (())はあなたがおそらく予想していた振る舞いを与えます。

+0

ありがとうございます。私はあなたの答えが本当に好きだった。私が知らなかった何かに向けて私を指摘した。 – Anon

0

echo ${pkg} | grep -qE "bz2$"echo ${pkg} | grep -q -E "bz2$" で置き換えると、魅力的に機能します。 [編集] if()条件を に変更するif [ $? -ne 1 ] ; then

関連する問題