سؤال

إما أن فاتني بعض رد الفعل العنيف أو رد الفعل لا يبدو أنه يعمل مع الكثير من حلقة المبرمجة.

$ echo "hello1-`echo hello2-\`echo hello3-\`echo hello4\`\``"

hello1-hello2-hello3-echo hello4

مطلوب

hello1-hello2-hello3-hello4-hello5-hello6-...
هل كانت مفيدة؟

المحلول

يستخدم $(commands) في حين أن:

$ echo "hello1-$(echo hello2-$(echo hello3-$(echo hello4)))"
hello1-hello2-hello3-hello4

$(commands) يفعل نفس الشيء مثل backticks ، ولكن يمكنك أن تعشهم.

قد تكون مهتمًا أيضًا بتوسعات نطاق Bash:

echo hello{1..10}
hello1 hello2 hello3 hello4 hello5 hello6 hello7 hello8 hello9 hello10

نصائح أخرى

إذا أصرت على استخدام backticks ، يمكن القيام باتباع

$ echo "hello1-`echo hello2-\`echo hello3-\\\`echo hello4\\\`\``"

عليك أن تضع الانتشار الخلفي ، \\ \\\\ \\\\\\\\ بواسطة 2x وما إلى ذلك ، إنه مجرد قبيح للغاية ، والاستخدام $(commands) كما اقترح آخر.

في أي وقت تريد تقييم استخدام الأمر command substitution:

$(command)

في أي وقت تريد تقييم استخدام التعبير الحسابي expression substitution:

$((expr))

يمكنك أن تعش هذا مثل هذا:

دعنا نقول ملفات 1.txt طولها 30 سطرًا و file2.txt طولها 10 أسطر ، مما يمكنك تقييم تعبير مثل هذا:

$(( $(wc -l file1.txt) - $(wc -l file2.txt) ))

التي ستخرج 20 (الفرق في عدد الخطوط بين ملفين).

إنه أسهل كثيرًا إذا كنت تستخدم Bash's $(cmd) بناء جملة الاستبدال, ، وهو أكثر ودية إلى أن تكون متداخلًا:

$ echo "hello1-$(echo hello2-$(echo hello3-$(echo hello4)))"
hello1-hello2-hello3-hello4

في بعض الأحيان يمكن استبدال التعشيش بالظهر xargs والأنابيب

$ echo hello4 | xargs echo hello3 | xargs echo hello2 | xargs echo hello1
hello1 hello2 hello3 hello4

عيب هذا الحل هو:

  • يجب توفير جميع الحجج بترتيب عكسي (4 → 1) ؛
  • تصبح جميع الحجج منفصلة عن مساحة (قابلة للحل مع tr):

    $ echo hello4 | xargs echo hello3 | xargs echo hello2 | xargs echo hello1 | tr ' ' '-'
    hello1-hello2-hello3-hello4
    


دعنا نعرض حالة استخدام حقيقية.

تتبع الأوامر العمل في باش ، ولكن ليس في TCSH (لا يتم التعامل مع تعشيش Backtick جيدًا في TCSH)

$ ls $(dirname $(which bash))
$ ls `dirname \`which bash\``

يمكن استبدالها مع

$ which bash | xargs dirname | xargs ls
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top