إنشاء قوائم الوسائط التي تحتوي على مسافات بيضاء
-
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
إذًا كيف يمكنك إنشاء قوائم الوسائط عندما تحتوي الوسائط على مسافات بيضاء؟
المحلول
هناك (على الأقل) طريقتان للقيام بذلك:
استخدم مصفوفة وقم بتوسيعها باستخدام
"${array[@]}"
:bar() { local i=0 args=() for arg in "$@" do args[$i]="prefix $arg" ((++i)) done foo "${args[@]}" }
إذن، ماذا تعلمنا؟
"${array[@]}"
هو${array[*]}
ماذا"$@"
هو$*
.أو إذا كنت لا ترغب في استخدام المصفوفات التي تحتاج إلى استخدامها
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[@]}"
ويمكنك استخدام المصفوفات كما توحي لك، مع تفصيل صغير تغييرها. وفو خط الدعوة يجب قراءة
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