التعبيرات المنطقية في البرامج النصية قذيفة

StackOverflow https://stackoverflow.com/questions/48774

  •  09-06-2019
  •  | 
  •  

سؤال

ما هو "الحق" وسيلة للقيام التالية كما منطقية التعبير ؟

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
...
هل كانت مفيدة؟

المحلول

حلول أخرى يكون الزوجان من الأخطاء الشائعة: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 لا يقتبس, ومن هنا أسماء الأماكن سوف يسبب مشاكل

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

نصائح أخرى

حتى أقصر:

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

النظر في استخدام الحالة بيان:

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

للرجوع إليها في المستقبل الجديد [[ اختبار المشغل المفضل.الجواب المقبول هو كل ما ذكر ينطبق ، ولكن هذا الجواب سوف تتطلب الكثير نقلا عن ويدعو إلى اختبارات متعددة.

الأسلوب المفضل سيكون شيئا مثل:

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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top