আমি মনে করি আপনি সেখানে দুটি ভিন্ন জিনিস জিজ্ঞাসা করছেন।
লুপ ছাড়াই এই তথ্যটি প্রিন্ট করার কোনও উপায় আছে?
হ্যাঁ, তবে তারা কেবল লুপটি ব্যবহার করার মতো ভাল নয়।
আউটপুটের কেবল কী = মান অংশটি / প্রিন্ট করার কোনও ক্লিনার উপায় আছে?
হ্যাঁ, for
লুপ এটির সুবিধাগুলি রয়েছে যে এটির জন্য বাহ্যিক প্রোগ্রামের প্রয়োজন হয় না, সরল হয় এবং বিস্মিত না করে সঠিক আউটপুট ফর্ম্যাটটিকে নিয়ন্ত্রণ করা বরং আরও সহজ করে তোলে।
declare -p
( typeset -p
) এর আউটপুট হ্যান্ডেল করার চেষ্টা করে এমন যে কোনও সমাধানের সাথে ডিল করতে হবে) ক) বন্ধনী বা বন্ধনী যুক্ত ভেরিয়েবলের সম্ভাবনা, খ) declare -p
শেলটির জন্য আউটপুটকে বৈধ ইনপুট করার জন্য যে উদ্ধৃতি যুক্ত করতে হবে।
উদাহরণস্বরূপ, আপনার প্রসারিত b="${a##*(}"
কিছু মান খায়, যদি কোনও কী / মানটিতে একটি খোলার প্রথম বন্ধনী থাকে। এটি কারণ আপনি ব্যবহার করেছেন ##
যা দীর্ঘতম উপসর্গটি সরিয়ে দেয় । একই জন্য c="${b%% )*}"
। যদিও আপনি অবশ্যই declare
আরও সঠিকভাবে মুদ্রিত বয়লারপ্লেটের সাথে মেলাতে পারতেন , আপনি যদি এখনও সমস্ত উদ্ধৃতি না চান তা পেতে আপনার একটি কঠিন সময় লাগবে।
আপনার প্রয়োজন না হলে এটি খুব সুন্দর দেখাচ্ছে না।
$ declare -A array=([abc]="'foobar'" [def]='"foo bar"')
$ declare -p array
declare -A array='([def]="\"foo bar\"" [abc]="'\''foobar'\''" )'
সঙ্গে for
লুপ, এটা হিসাবে আপনি চান আউটপুট ফরম্যাট চয়ন করা আরো সহজ:
# without quoting
$ for x in "${!array[@]}"; do printf "[%s]=%s\n" "$x" "${array[$x]}" ; done
[def]="foo bar"
[abc]='foobar'
# with quoting
$ for x in "${!array[@]}"; do printf "[%q]=%q\n" "$x" "${array[$x]}" ; done
[def]=\"foo\ bar\"
[abc]=\'foobar\'
সেখান থেকে অন্যথায় আউটপুট ফর্ম্যাটটি পরিবর্তন করা সহজ (অন্যদিকে কীটি বন্ধনীগুলি সরিয়ে ফেলুন, সমস্ত কী / মান জোড়া একক লাইনে রাখুন ...)। আপনার যদি শেল নিজেই ছাড়া অন্য কোনও কিছুর উদ্ধৃতি দরকার হয়, আপনার এখনও এটি নিজের দ্বারা করা দরকার, তবে কমপক্ষে আপনার কাজ করার জন্য কাঁচা ডেটা থাকতে হবে। (যদি আপনার কী বা মানগুলিতে নতুন লাইন থাকে তবে আপনার সম্ভবত কিছু উদ্ধৃতি প্রয়োজন)
বর্তমান বাশ (৪.৪, আমার মনে হয়) এর সাহায্যে আপনি এর printf "[%s]=%s" "${x@Q}" "${array[$x]@Q}"
পরিবর্তে ব্যবহার করতে পারেন printf "%q=%q"
। এটি কিছুটা সুন্দর উদ্ধৃতিযুক্ত ফর্ম্যাট তৈরি করে, তবে অবশ্যই মনে রাখতে হবে আরও কিছু কাজ a (এবং এটি @
অ্যারের কী হিসাবে কর্নার কেসের %q
উদ্ধৃতি দেয় , যা উদ্ধৃতি দেয় না))
যদি লুপটি লিখতে খুব ক্লান্ত মনে হয় তবে এটি কোথাও একটি ফাংশন সংরক্ষণ করুন (এখানে উদ্ধৃতি না দিয়ে):
printarr() { declare -n __p="$1"; for k in "${!__p[@]}"; do printf "%s=%s\n" "$k" "${__p[$k]}" ; done ; }
এবং তারপরে এটি ব্যবহার করুন:
$ declare -A a=([a]=123 [b]="foo bar" [c]="(blah)")
$ printarr a
a=123
b=foo bar
c=(blah)
ইনডেক্সড অ্যারেগুলির সাথেও কাজ করে:
$ b=(abba acdc)
$ printarr b
0=abba
1=acdc
printf ...%q...
বৈকল্পিকের আউটপুটটি শেলের পুনর্নির্মাণের জন্য উপযুক্ত নয় যদি অ্যারেতে একটি@
কী থাকে কারণ% q এর উদ্ধৃতি না দেয় এবংa=([@]=value)
এটি একটি সিনট্যাক্স ত্রুটি হয়bash
।