bash - وتساقط - كريم طبي لقشرة الشعر




متى نحتاج الأقواس المتعرجة حول متغيرات القشرة؟ (4)

أنت تستخدم {} للتجميع. مطلوبة الأقواس إلى عناصر صفيف dereference. مثال:

dir=(*)           # store the contents of the directory into an array
echo "${dir[0]}"  # get the first entry.
echo "$dir[0]"    # incorrect

في نصوص shell ، متى نستخدم {} عند توسيع المتغيرات؟

على سبيل المثال ، لقد رأيت ما يلي:

var=10        # Declare variable

echo "${var}" # One use of the variable
echo "$var"   # Another use of the variable

هل هناك فرق كبير ، أم أنه مجرد أسلوب؟ هو واحد يفضل على الآخر؟


بعد اقتراح SierraX و Peter حول معالجة النص ، تستخدم الأقواس المتعرجة {} تمرير متغير إلى أمر ، على سبيل المثال:

لنفترض أن لديك ملف sposi.txt يحتوي على السطر الأول من رواية إيطالية معروفة باسم Weel :

> sposi="somewhere/myfolder/sposi.txt"
> cat $sposi

Ouput: quel ramo del lago di como che volge a mezzogiorno

الآن إنشاء اثنين من المتغيرات:

# Search the 2nd word found in the file that "sposi" variable points to
> word=$(cat $sposi | cut -d " " -f 2)

# This variable will replace the word
> new_word="filone"

الآن استبدال الكلمة متغير المحتوى مع الكلمة new_word ، داخل ملف sposi.txt

> sed -i "s/${word}/${new_word}/g" $sposi
> cat $sposi

quel filone del lago di como che volge a mezzogiorno : quel filone del lago di como che volge a mezzogiorno

تم استبدال كلمة "ramo".


في هذا المثال بالذات ، لا يوجد فرق. ومع ذلك ، فإن {} في ${} مفيدة إذا كنت تريد توسيع متغير foo في السلسلة

"${foo}bar"

منذ "$foobar" بدلا من ذلك توسيع foobar .

الأقواس المتعرجة مطلوبة أيضًا دون شروط عندما:

  • توسيع عناصر الصفيف ، كما هو الحال في ${array[42]}
  • باستخدام عمليات توسيع المعلمات ، كما هو الحال في ${filename%.*} (إزالة الامتداد)
  • توسيع المعلمات الموضعية بعد 9: "$8 $9 ${10} ${11}"

يمكن اعتبار ممارسة هذا في كل مكان ، بدلاً من فقط في حالات قد تكون غامضة ، ممارسة برمجة جيدة. هذا هو التناسق ولتجنب المفاجآت مثل $foo_$bar.jpg ، حيث لا يكون واضحًا بصريًا أن $foo_$bar.jpg السفلية تصبح جزءًا من اسم المتغير.


يتم الإعلان عن المتغيرات وتعيينها بدون $ وبدون {} . عليك أن تستخدم

var=10

ليسجل. لكي تقرأ من المتغير (بمعنى آخر ، "توسيع" المتغير) ، يجب عليك استخدام $ .

$var      # use the variable
${var}    # same as above
${var}bar # expand var, and append "bar" too
$varbar   # same as ${varbar}, i.e expand a variable called varbar, if it exists.

هذا قد أربكني أحيانًا - بلغات أخرى نشير إلى المتغير بنفس الطريقة ، بغض النظر عما إذا كان على يسار أو حق الواجب. لكن كتابة البرامج النصية مختلفة ، فإن $var=10 لا يفعل ما قد تظنه!





curly-braces