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
...
4

5 に答える 5

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つの問題があります。

    を。は$i引用符で囲まれていないため、名前にスペースが含まれていると問題が発生します

    b. 短絡しないため、ファイルをingすると-a非効率的です(上記はファイルをingしないことを知っています)。statstat

代わりに試してください:

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
于 2008-09-15T15:47:04.653 に答える
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;

if式の-ainは、シェルテストのブールANDと同等です。詳細については、を参照してくださいman test

于 2008-09-07T21:15:38.563 に答える
3

caseステートメントの使用を検討してください。

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
于 2008-09-15T16:04:35.763 に答える
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
于 2008-09-07T21:04:57.997 に答える
1

今後の参考のために、新しい [[ テスト演算子を使用することをお勧めします。受け入れられた回答は近く、言及されているすべてが適用されますが、その回答には多くの引用と複数のテストへの呼び出しが必要になります。

好ましい方法は次のようなものです。

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
于 2015-07-25T19:10:08.633 に答える