ব্যাশ-এ নতুন লাইনে অ্যারের প্রতিটি উপাদান সহ একটি ফাইলে একটি অ্যারে মুদ্রণ করা হচ্ছে


13

আমি অ্যারেটির উপাদানগুলি ফাইলের একটি নতুন লাইনে অ্যারের প্রতিটি উপাদান সহ একটি ফাইলে চেষ্টা করছি।

IFS=$'\n'   
echo "${mtches[@]}" > sample1.txt 


মিচেসের বিষয়বস্তু হ'ল "কিউই" এবং "এস্যাসেড"। তবে sample1.txtফাইলটি qwe asdএকটি একক লাইনে রয়েছে। কেন এটি ছবিতে আইএফএসের মান নিচ্ছে না?

উত্তর:


17

এর পরিবর্তে আপনার ব্যবহার printfকরা উচিতecho :

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

যদি mtchesখালি থাকে তবে এখনও একটি খালি লাইন আউটপুট হবে। তার জন্য অ্যাকাউন্ট করতে:

{ [ "${#mtches[@]}" -eq 0 ] || printf '%s\n' "${mtches[@]}"; } > file

ইন bash(এবং POSIX শাঁস), আপনি প্রায়ই ব্যবহার অবস্থানগত পরামিতি অ্যারে হিসাবে "$@"পরিবর্তে "$*", যদি না আপনি একটি বিশেষ কারণ আছে। ম্যান বাশ থেকে - বিভাগের অ্যারেগুলি থেকে নিয়মিত অ্যারেগুলিকে সমর্থন করে এমন গোলাগুলিতে এটি সত্য :

অ্যারের কোনও উপাদান $ {নাম [সাবস্ক্রিপ্ট] using ব্যবহার করে রেফারেন্স করা যেতে পারে} শেলের ফাইল নাম সম্প্রসারণ অপারেটরগুলির সাথে দ্বন্দ্ব এড়াতে ধনুর্বন্ধনী প্রয়োজন সাবস্ক্রিপ্ট যদি '@' বা '*' হয় তবে শব্দটি অ্যারের নামের সমস্ত সদস্যের কাছে প্রসারিত হয়। এই সাবস্ক্রিপ্টগুলি কেবল তখনই পৃথক হয় যখন শব্দটি ডাবল উদ্ধৃতিতে উপস্থিত হয়। যদি শব্দটি ডাবল-কোট করা হয় তবে $ {নাম [*] আইএফএস ভেরিয়েবলের প্রথম অক্ষর দ্বারা পৃথক পৃথক প্রতিটি অ্যারে সদস্যের মান সহ একটি শব্দে প্রসারিত হয় এবং $ {নাম [@] name নামের প্রতিটি উপাদানকে প্রসারিত করে একটি পৃথক শব্দ। যখন কোনও অ্যারে সদস্য না থাকে, তখন $ {নাম [@]। কিছুতেই প্রসারিত হয়। যদি কোনও শব্দের মধ্যে দ্বিগুণ-উদ্ধৃত প্রসারণ ঘটে তবে প্রথম প্যারামিটারের প্রসারটি মূল শব্দের প্রারম্ভিক অংশের সাথে যুক্ত হয় এবং শেষ প্যারামিটারের প্রসারণটি মূল শব্দের শেষ অংশের সাথে যুক্ত হয়।

"${array[*]}"আপনি যখন কোনও স্ট্রিতে সমস্ত অ্যারে উপাদানগুলিতে যোগদান করতে চান কেবল তখনই ব্যবহার করুন ।


কীভাবে এই দ্বিগুণ হবে?
আশ্বিন


7

আপনি ${mtches[*]}পরিবর্তে ব্যবহার করতে চান ।

আপনি যখন ব্যবহার করবেন "${mtches[@]}", এটির মূল্য কী তা বিবেচনাধীন নয় $IFS, বাশ অ্যারেটিকে একাধিক যুক্তিতে বিভক্ত করবে। আপনি যা চান তা হ'ল প্রতিটি অ্যারে উপাদান সহ একক যুক্তি \n${mtches[*]}এটি সম্পাদন করে

এছাড়াও সেটিংয়ের একটি অস্থায়ী উপায় হিসেবে $IFS, আপনি কি করতে পারেন:

( IFS=$'\n'; echo "${mtches[*]}" > sample1.txt )

তারপরে আপনাকে এটিকে আবার সেট করে নিয়ে বিরক্ত করতে হবে না।


pubs.opengroup.org/onlinepubs/9699919799/utilities/… <- পসিক্স রেফারেন্স (এটি কেবল বাশের ক্ষেত্রে প্রযোজ্য নয়)।
মাদুর

বা ব্যবহার করুন printf...
জেসনওয়ারিয়ান

2

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

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

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

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

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

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

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

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

1
for ENTRY in ${ARRAY[@]}; do
    echo $ENTRY
done > outfile

সুন্দর এবং পঠনযোগ্য এবং এর অর্থ আইএফএসের সাথে বিশৃঙ্খলা নয়। এর অর্থ হ'ল আপনি প্রতিটি লাইনের হ্যান্ডলিং কাস্টমাইজ করতে পারেন।


1
তবে ভুল হিসাবে আপনি ব্যবহার করছেন echoযা স্বেচ্ছাচারী বিষয়বস্তু জন্য ব্যবহার করা যাবে না এবং আপনার ভেরিয়েবল উদ্ধৃত করতে ভুলে গেছেন । কিছুটা ভাল সংস্করণ ইতিমধ্যে স্টিভেনপেনি পোস্ট করেছেন
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.