شرح - bash معنى




نشر كل الوسيطات في برنامج نصي bash shell (5)

أدرك أن هذا قد تم الإجابة عليه بشكل جيد ولكن هنا مقارنة بين "$ @" $ @ "$ *" و $ *

محتويات اختبار البرنامج النصي:

# cat ./test.sh
#!/usr/bin/env bash
echo "================================="

echo "Quoted DOLLAR-AT"
for ARG in "[email protected]"; do
    echo $ARG
done

echo "================================="

echo "NOT Quoted DOLLAR-AT"
for ARG in [email protected]; do
    echo $ARG
done

echo "================================="

echo "Quoted DOLLAR-STAR"
for ARG in "$*"; do
    echo $ARG
done

echo "================================="

echo "NOT Quoted DOLLAR-STAR"
for ARG in $*; do
    echo $ARG
done

echo "================================="

الآن ، قم بتشغيل البرنامج النصي الاختبار مع الوسائط المختلفة:

# ./test.sh  "arg with space one" "arg2" arg3
=================================
Quoted DOLLAR-AT
arg with space one
arg2
arg3
=================================
NOT Quoted DOLLAR-AT
arg
with
space
one
arg2
arg3
=================================
Quoted DOLLAR-STAR
arg with space one arg2 arg3
=================================
NOT Quoted DOLLAR-STAR
arg
with
space
one
arg2
arg3
=================================

أكتب نصًا بسيطًا جدًا يستدعي برنامجًا نصيًا آخر ، وأحتاج إلى نشر المعلمات من نصيتي الحالية إلى النص البرمجي الذي أقوم بتنفيذه.

على سبيل المثال ، اسم البرنامج النصي الخاص بي هو foo.sh و calls bar.sh

foo.sh:

bar $1 $2 $3 $4

كيف يمكنني القيام بذلك دون تحديد كل معلمة بشكل صريح؟



يحتوي My SUN Unix على الكثير من القيود ، حتى "$ @" لم يتم تفسيره على النحو المرغوب فيه. حلّي هو $ {@}. فمثلا،

#!/bin/ksh
find ./ -type f | xargs grep "${@}"

بالمناسبة ، كان علي أن أحصل على هذا البرنامج النصي لأن يونكس الخاص بي لا يدعم grep -r


يعمل بشكل جيد ، إلا إذا كان لديك مسافات أو أحرف هروب. لا أجد طريقة لالتقاط الحجج في هذه الحالة وإرسالها إلى ssh داخل النص البرمجي.

هذا يمكن أن يكون مفيدا ولكنه قبيح جدا

_command_opts=$( echo "[email protected]" | awk -F\- 'BEGIN { OFS=" -" } { for (i=2;i<=NF;i++) { gsub(/^[a-z] /,"&@",$i) ; gsub(/ $/,"",$i );gsub (/$/,"@",$i) }; print $0 }' | tr '@' \' )

#!/usr/bin/env bash
while [ "$1" != "" ]; do
  echo "Received: ${1}" && shift;
done;

ظننت أن هذا الأمر قد يكون مفيدًا أكثر عند محاولة اختبار كيفية ظهور النص في النص البرمجي





scripting