إنشاء قوائم الوسائط التي تحتوي على مسافات بيضاء

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

  •  03-07-2019
  •  | 
  •  

سؤال

في bash يمكن للمرء الهروب من الوسائط التي تحتوي على مسافة بيضاء.

foo "a string"

يعمل هذا أيضًا مع الوسائط الخاصة بأمر أو وظيفة:

bar() {
    foo "$@"
}

bar "a string"

جيد جدًا حتى الآن، ولكن ماذا لو أردت التلاعب بالحجج قبل الاتصال foo?

هذا لا يعمل:

bar() {
    for arg in "$@"
    do
        args="$args \"prefix $arg\""
    done

    # Everything looks good ...
    echo $args

    # ... but it isn't.
    foo $args

    # foo "$args" would just be silly
}

bar a b c

إذًا كيف يمكنك إنشاء قوائم الوسائط عندما تحتوي الوسائط على مسافات بيضاء؟

هل كانت مفيدة؟

المحلول

هناك (على الأقل) طريقتان للقيام بذلك:

  1. استخدم مصفوفة وقم بتوسيعها باستخدام "${array[@]}":

    bar() {
        local i=0 args=()
        for arg in "$@"
        do
            args[$i]="prefix $arg"
            ((++i))
        done
    
        foo "${args[@]}"
    }
    

    إذن، ماذا تعلمنا؟ "${array[@]}" هو ${array[*]} ماذا "$@" هو $*.

  2. أو إذا كنت لا ترغب في استخدام المصفوفات التي تحتاج إلى استخدامها eval:

    bar() {
        local args=()
        for arg in "$@"
        do
            args="$args \"prefix $arg\""
        done
    
        eval foo $args
    }
    

نصائح أخرى

وهنا هو نسخة أقصر والتي لا تتطلب استخدام مؤشر رقمي:

و(على سبيل المثال: الحجج بناء على أمر find)

dir=$1
shift
for f in "$@" ; do
    args+=(-iname "*$f*")
done
find "$dir" "${args[@]}"

صفائف (واحد من في hidden في باش).

ويمكنك استخدام المصفوفات كما توحي لك، مع تفصيل صغير تغييرها. وفو خط الدعوة يجب قراءة

 foo "${args[@]}"

وكان لي مشكلة مع هذا أيضا كذلك. كنت أكتب نصي باش لعمل نسخة احتياطية من الملفات الهامة على نافذتي الكمبيوتر (سيغوين). حاولت نهج مجموعة جدا، وكان لا يزال بعض القضايا. لست متأكدا بالضبط كيف أنها ثابتة، ولكن هنا أجزاء من قانون بلدي التي تعتبر مهمة في حال انها لن تساعدك.

WORK="d:\Work Documents\*"
#   prompt and 7zip each file
for x in $SVN $WEB1 $WEB2 "$WORK" $GRAPHICS $W_SQL
do
    echo "Add $x to archive? (y/n)"
    read DO
    if [ "$DO" == "y" ]; then
        echo "compressing $x"
        7zip a $W_OUTPUT "$x"
    fi
    echo ""
done
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top