বাশে আলাদা লাইনে অ্যারে উপাদানগুলি মুদ্রণ করবেন?


229

আমি কীভাবে আলাদা লাইনে বাশ অ্যারের অ্যারের উপাদানটি মুদ্রণ করব? এটি একটি কাজ করে তবে অবশ্যই এর থেকে আরও ভাল উপায় আছে:

$ my_array=(one two three)
$ for i in ${my_array[@]}; do echo $i; done
one
two
three

এটি চেষ্টা করেও এটি কার্যকর হয়নি:

$ IFS=$'\n' echo ${my_array[*]}
one two three

উত্তর:


436

এটি করার চেষ্টা করুন:

$ printf '%s\n' "${my_array[@]}"

$@এবং এর মধ্যে পার্থক্য $*:

  • উদ্ধৃত, ফলাফল অনির্ধারিত। বাশ, উভয় পৃথক আরগ এবং তারপর ওয়ার্ডস্প্লিট এবং গ্লোববেড প্রসারিত।

  • উদ্ধৃত, "$@"প্রতিটি উপাদানকে পৃথক যুক্তি হিসাবে প্রসারিত করে, যখন "$*" একটি যুক্তিতে একীভূত করা আর্গগুলিতে প্রসারিত হয়: "$1c$2c..."(যেখানে cপ্রথম লেখাগুলি হয় IFS)।

আপনি প্রায় সবসময় চান "$@"। একই জন্য যায় "${arr[@]}"

সর্বদা তাদের উদ্ধৃতি!


5
এবং দ্রষ্টব্য, ভেরিয়েবল রেফারেন্সের চারপাশে ডাবল কোটগুলি গুরুত্বপূর্ণ যদি আপনি নিশ্চিত করতে চান যে অভ্যন্তরীণ স্পেস সহ উপাদানগুলি অজান্তে বিভক্ত না হয়।
ডানফুজ

4
@ স্পটনিক: কাজ করে না, অ্যারে উপাদানগুলি একক লাইনে শেষ হয়
অ্যাক্সেল ব্রেগনস্বো

1
কমান্ডের পরে দুটি হাইফেন কীসের জন্য? ম্যানুয়ালটিতে আমি এর কোনও উল্লেখ খুঁজে পাই না।
জোয়ানপাউ

3
এটিকে তৈরি করার কোনও উপায় কি যাতে বিনা কোনও অ্যারেতে কোনও উপাদান না থাকলে এটি কোনও ফাঁকা রেখা আউটপুট করে না | grep -v '^$'?
নোয়েল ইয়াপ

2
@espaciomore '% s \ n' হ'ল প্রিন্টফ ফাংশনের আউটপুট জন্য বিন্যাস। % s এর অর্থ স্ট্রিং আর্গুমেন্টের জন্য একটি স্থানধারক (এই ক্ষেত্রে অ্যারের উপাদান) এবং after n এর পরে একটি লাইন ব্রেক যোগ করে। সুতরাং, অ্যারের প্রতিটি উপাদান জন্য আউটপুট একটি স্ট্রিং এবং একটি লাইন বিরতি থাকবে।
কোজা

71

প্রতিবেদনের প্রতিধ্বনি কেবল উদ্ধৃত করুন:

( IFS=$'\n'; echo "${my_array[*]}" )

সাব শেল ব্যবহারের পরে আইএফএস পুনরুদ্ধার করতে সহায়তা করে


3
দুঃখিত, পেরেওল, আমি আপনার চেক মার্কটি স্পটনিককে সরিয়েছি, আপনার সমাধানটি আরও ভাল পছন্দ করেও, কারণ আমি 'প্রিন্টফ' ফাংশন সম্পর্কে শিখেছি।
এক্সেল ব্রেগনসবো

3
এই উত্তরের জন্য ধন্যবাদ - আমি এটি পছন্দ করি! খুব খারাপ অ্যাসাইনমেন্টগুলি প্রসারণের পরে ঘটে তাই IFS=$'\n' echo "${my_array[*]}"কাজ করে না। আচ্ছা ভালো!
cxw

@ সিএক্সডাব্লু, "অ্যাসাইনমেন্টগুলি" বলতে কী বোঝ?
স্টিভন শ

1
@bslueter, আমি বাশ 4 - 4.4.23 (1) -রিলিজ দিয়ে চেষ্টা করেছি - এবং এটি কার্যকর!
স্টিভেন শ

1
@ সিএক্সডাব্লু আহ, আপনি সেখানে কী করার চেষ্টা করছেন তা আমি দেখতে পাইনি। আমি মনে করি এটি কার্যকর হয় না কারণ echoবাশের একটি অন্তর্নির্মিত। তবে, আপনি এটি একটি ফাংশন মোড়ানো করতে পারেন এবং এটি কাজ করবে! gist.github.com/steshaw/53ba0095bce8ccab52d26a14375dedb8
স্টিভেন শ

40

এর জন্য ব্যবহার :

for each in "${alpha[@]}"
do
  echo "$each"
done

ইতিহাস ব্যবহার ; নোটগুলি ব্যর্থ হবে যদি আপনার মানগুলি থাকে !:

history -p "${alpha[@]}"

বেসনাম ব্যবহার করা ; নোটগুলি ব্যর্থ হবে যদি আপনার মানগুলি থাকে /:

basename -a "${alpha[@]}"

শুফ ব্যবহার করা ; নোট করুন যে ফলাফলগুলি ক্রমে বেরিয়ে আসতে পারে:

shuf -e "${alpha[@]}"

19
"শুফ" ... "ক্রমে বেরিয়ে আসতে পারে না" ... হাস্যকর।
ওয়ালফ

4
shuf জন্য। কে এটা ব্যবহার করতে ভেবেছিলেন?
fbicknel 22'19

3

আমি এখানে লুপগুলির জন্য উত্তরগুলি চেষ্টা করেছিলাম ... যদি লুপ হয় তবে কোনও আনন্দ পাই না - তাই আমি এটি এরকম করেছিলাম, সম্ভবত অগোছালো তবে কাজটি করেছি:

 # EXP_LIST2 is iterated    
 # imagine a for loop
     EXP_LIST="List item"    
     EXP_LIST2="$EXP_LIST2 \n $EXP_LIST"
 done 
 echo -e $EXP_LIST2

যদিও এটি তালিকায় একটি স্থান যুক্ত করেছে, যা ভাল - আমি এটি কিছুটা ইন্টেন্ট করতে চেয়েছিলাম। ধরে নিন যে "\ n" মূল $ EP_LIST এ মুদ্রিত হতে পারে।


5
একটি সম্পূর্ণ উদাহরণ মত দেখাচ্ছে না।
কেনারব

3

আর একটি দরকারী বৈকল্পিক পাইপ হ'ল tr:

echo "${my_array[@]}" | tr ' ' '\n'

এটি দেখতে সহজ এবং কমপ্যাক্ট দেখাচ্ছে


11
এই বিরতি ব্যতীতmy_array=( "one two" three )
মাইক হোল্ট

এটি ডাবল উদ্ধৃতি দিয়ে স্থির করুন।
স্টিভন শ

বাশ সংস্করণ 4+ এ বিজ্ঞাপনিত হিসাবে কাজ করেনি , ব্যবহার করতে হয়েছিল echo "${my_array[@]}" | tr '' ' \n', যদিও ব্যক্তিগতভাবে আমি echoএরকম ব্যবহার এড়াতে চাইছি , যেখানে trআমার পছন্দ আমি মনে করি এর মতো কিছু tr '' ' \n' <<<"${my_array[@]}"পরে পড়তে কিছুটা সহজ হতে পারে।
S0AndS0
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.