কীভাবে বাশ ব্যাকটিক্সকে সঠিকভাবে বাসা বাঁধবে


95

হয় আমি কিছু ব্যাকল্যাশ মিস করেছি বা ব্যাকল্যাশিং খুব বেশি প্রোগ্রামার-উদ্ধৃতি-লুপিংয়ের সাথে কাজ করছে বলে মনে হচ্ছে না।

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

hello1-hello2-hello3-echo hello4

চেয়েছিলেন

hello1-hello2-hello3-hello4-hello5-hello6-...

প্রশ্নটি সম্ভবত "বার্স ব্যাকটিক্স পুনরাবৃত্তভাবে কীভাবে ব্যবহার করতে হয়" পড়তে হবে। এটি সেখানে গুগলদের সহায়তা করবে।
জোয়ে অ্যাডামস

আপনি কি করতে চেষ্টা করছেন তা? এর মোটেই কোন অর্থ নেই।
ghostdog74

4
@ জোয়ে, শিরোনাম পরিবর্তিত হয়েছে, আপনাকে স্বাগতম: ডি
স্টর্মেনেট

4
উফ, স্ক্র্যাচ। এটি পড়তে হবে "আমি কীভাবে বাশে বাসা বাঁধব?" । আমি পুনরাবৃত্তি পেয়েছি এবং বাসা বেঁধেছি।
জোয়ে অ্যাডামস

ব্যাকটিকগুলি deprecatedতাই ব্যবহার করুন $(cmd)
টিমো

উত্তর:


149

$(commands)পরিবর্তে ব্যবহার করুন:

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

$(commands) ব্যাকটিক্সের মতো একই কাজ করে তবে আপনি সেগুলি বাসাতে পারেন।

আপনি বাশ সীমার বিস্তৃতিতেও আগ্রহী হতে পারেন:

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

1 1..10 like এর মতো +1} অ্যারে দিয়ে সীমাবদ্ধ? জেডএসএইচ "$ {$ (তারিখ) [2,4]।" করতে পারে। কেন নয়: "প্রতিধ্বনি $ {ইকো হ্যালো 1 - $ (ইকো হ্যালো 2) [1]?"?
এইচ এইচ

35

আপনি ব্যাকটিক্স ব্যবহার করার জন্য জিদ করলে নিম্নলিখিতটি করা যেতে পারে

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

আপনাকে ব্যাকস্ল্যাশগুলি \\ \\\\ \\\\\\\\2x দ্বারা চালিত করতে হবে এবং এটি ঠিক খুব কুরুচিপূর্ণ, $(commands)অন্যান্য প্রস্তাবিত হিসাবে ব্যবহার করতে হবে ।


11

আপনি যে কোনও সময় কমান্ডটি মূল্যায়ন করতে চান command substitution:

$(command)

যে কোনও সময় আপনি পাটিগণিতের এক্সপ্রেশন ব্যবহারটি মূল্যায়ন করতে চান expression substitution:

$((expr))

আপনি এগুলি এভাবে বাসাতে পারেন:

ধরা যাক ফাইল1.txt 30 লাইনের লম্বা এবং ফাইল 2.txt 10 লাইন দীর্ঘ, আপনি এই জাতীয় মত প্রকাশের চেয়ে মূল্যায়ন করতে পারেন:

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

যা আউটপুট 20 (দুটি ফাইলের মধ্যে লাইন সংখ্যার পার্থক্য) হবে


10

আপনি যদি বাশের $(cmd) কমান্ড সাবস্টিটিউশন সিনট্যাক্স ব্যবহার করেন তবে এটি অনেক সহজ which

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

4
এটি কেবল বাশকে সীমাবদ্ধ নয় । এটি পসিক্স 1003.1 ("পসিক্স শেলস") এবং সর্বাধিক বোর্ন-উত্পন্ন শেল ( কেএস , অ্যাশ , ড্যাশ , ব্যাশ , জেডএস , ইত্যাদি) অনুসারে এমন সমস্ত শেলগুলিতে পাওয়া যায় যদিও আসল বোর্ন শেল নয় (যেমন heirloom.sourceforge.net /sh.html )।
ক্রিস জনসন

বাহ, এই উত্তরটির টাইমস্ট্যাম্পটি @ জোয়াই_এডামসের উত্তরটির পক্ষে স্বতন্ত্র! এটির সংক্ষিপ্তসারটি সবচেয়ে আক্ষরিক অর্থ :) এখানেও উত্সাহ দেওয়া (:
ড্রেভিকো

0

কখনও কখনও ব্যাকটিক বাসা বাঁধতে 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
    


আসল ব্যবহারের কেসটি দেখান।

নিম্নলিখিত কমান্ডগুলি ব্যাশে কাজ করে তবে টিসিএস-তে নয় (ব্যাকটিক নেস্টিং টিসিএস-তে খুব ভাল পরিচালনা করা হয় না)

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

তারা প্রতিস্থাপন করা যেতে পারে

$ which bash | xargs dirname | xargs ls
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.