2008-09-07 8 views
11

ブール式として以下を実行する「正しい」方法は何ですか?シェルスクリプト内のブール式

for i in `ls $1/resources`; do 
    if [ $i != "database.db" ] 
    then 
     if [ $i != "tiles" ] 
     then 
      if [ $i != "map.pdf" ] 
      then 
       if [ $i != "map.png" ] 
       then 
        svn export -q $1/resources/$i ../MyProject/Resources/$i 
... 

答えて

11

を参照してください他のソリューションは、一般的なミスのカップルを持っている: http://www.pixelbeat.org/programming/shell_script_mistakes.html

  1. for i in $(ls ...)ある冗長/問題 だけの操作を行います。for i in $1/resources*; do ...

  2. [ $i != file1 -a $1 != file2 ]は、この実際に2つの問題を抱えています。

    a。 $iは引用符で囲まれていないため、スペースを含む名前は問題を引き起こします。

    b。 -aは、短絡しないようにファイルをstatにすると、非効率です(私は上記のファイルがstatファイルではないことを知っています)。

代わりにしてみてくださいので:

for i in $1/resources/*; do 
    if [ "$i" != "database.db" ] && 
     [ "$i" != "tiles" ] && 
     [ "$i" != "map.pdf" ] && 
     [ "$i" != "map.png" ]; then 
     svn export -q "$i" "../MyProject/Resources/$(basename $i)" 
    fi 
done 
1
for i in `ls $1/resources`; do 
    if [ $i != "database.db" ] && [ $i != "tiles" ] && [ $i != "map.pdf" ] && [ $i != "map.png" ]; then 
     svn export -q $1/resources/$i ../MyProject/Resources/$i 
7

でも短い:

for i in `ls $1/resources`; do 
    if [ $i != databse.db -a $i != titles -a $i != map.pdf ]; then 
    svn export -q $1/resources/$i ../MyProject/Resources/$i 
    fi 
done; 

-a式はブールのシェル・テストにおいて同等である場合。よりman test

3

ケース文を使用して考えてみましょう。今後の参考のために

for i in $(ls $1/resources); do 
    case $i in 
     database.db|tiles|map.pdf|map.png) 
      ;; 
     *) 
      svn export -q $1/resources/$i ../MyProject/Resources/$i;; 
    esac 
done 
0

を、新しい[[テストオペレーターが好ましいです。受け入れられた答えは近いものの、言及されているすべてが当てはまりますが、その回答には多くの引用と複数のテストの呼び出しが必要です。

好ましい方法は、のようになります。

for i in $1/resources/*; do 
    if [[ $i != "database.db" && $i != "tiles" && 
       $i != "map.pdf" && $i != "map.png" ]]; then 
     svn export -q "$i" "../MyProject/Resources/$(basename $i)" 
    fi 
done