আমি ব্যাশে কোনও অ্যারে হিসাবে ব্যবহারকারী ইনপুট কীভাবে পড়তে পারি?


15

আমি কীভাবে bashশেলটিতে অ্যারে হিসাবে ব্যবহারকারী ইনপুট পড়তে পারি ?


আমি ধারণা করছি আপনি স্টিডিন থেকে পড়তে চান? আমার উত্তরটিও মৃত্যুদণ্ড কার্যকর করার মতো কাজ করবে cat war_and_peace.txt | ./array_test.sh
স্টেফানো প্যালাজো

বা সহজভাবে ./array_test.sh < war_and_peace.txt
এলিয়াহ কাগন

উত্তর:


14

এটি করার একটি উপায় এখানে:

while read line
do
    my_array=("${my_array[@]}" $line)
done

echo ${my_array[@]}

আপনি যদি কেবল এটি চালান, আপনি সিটিআরএল + ডি (ইওএফ) না চাপানো পর্যন্ত এটি স্ট্যান্ডার্ড-ইনপুট থেকে পড়া চালিয়ে যাবে। পরবর্তীতে লাইন আপনার লেখা থাকবে my_array। কিছু এই কোড বিভ্রান্তিকর হতে পারে। লুপটির শরীরটি মূলত বলে my_array = my_array + element

ডকুমেন্টেশন কিছু আকর্ষণীয় টুকরা:


3
read -rকখনও কখনও বেশ দরকারী / গুরুত্বপূর্ণ ... স্টেফানোর লিঙ্ক "রিড বিল্টিন ম্যানপেজে" এর উদ্দেশ্যটি ব্যাখ্যা করে ... (ব্যাকস্ল্যাশ ব্যাখ্যা রোধ করতে)।
পিটার.ও

10

এটি ব্যবহার করে এটি পড়ুন:

read -a arr

এবং মুদ্রণের জন্য, ব্যবহার করুন:

for elem in ${arr[@]}
do 
  echo $elem
done

4

এবং একটি যা প্রতিবার অ্যারেটি পুনরায় তৈরি করে না (যদিও বাশ 3.1 বা আরও বেশি প্রয়োজন):

array=()
while IFS= read -r -p "Next item (end with an empty line): " line; do
    [[ $line ]] || break  # break if line is empty
    array+=("$line")
done

printf '%s\n' "Items read:"
printf '  «%s»\n' "${array[@]}"

আরও জানতে http://mywiki.wooledge.org/BashFAQ/001 দেখুন।

এবং সর্বদা হিসাবে, বাগ লেখা এড়াতে http://mywiki.wooledge.org/BashGuide পড়ুন এবং tldp- গাইডগুলি অ্যাডভান্সড ব্যাশ স্ক্রিপ্টিং গাইডের মতো এড়ান।


চমৎকার লিঙ্কগুলি ... IFSসমস্যাটি দেখানোর জন্য ধন্যবাদ । এটিকে শূন্য না করে, সমস্ত পঠিত এবং পিছনের শ্বেত স্পেসে 'পড়ুন' স্ক্রিপ্টগুলি ... এবং অবশ্যই -rখুব ...
পিটার.ও

0

এই ওয়ান-লাইনার সম্পর্কে কীভাবে;)

arr=( $(cat -) )
echo ${arr[@]}

সম্পাদনা:

ইন bash,

arr=(val1 val2 ...)

একটি অ্যারে বরাদ্দ করার উপায় । কমান্ড প্রতিস্থাপনের সাথে এটি ব্যবহার করে, আপনি পাইপলাইন থেকে অ্যারেগুলিতে পড়তে পারেন যা এটি readসরাসরি-অগ্রসর পদ্ধতিতে সম্পন্ন করার জন্য ব্যবহার করা সম্ভব নয় :

echo -e "a\nb" | read -a arr
echo ${arr[@]}

আপনি দেখতে পাবেন যে এটি কোনও পাইপ যখন কোনও পাইপ নেই সেহেতু readকিছুই করে না কারণ আউটপুটটি stdinসাবচেলে চালিত হতে পারে যাতে ভেরিয়েবলটি ব্যবহারযোগ্য না হয়।

এই উত্তর দ্বারা প্রস্তাবিত উপায় ব্যবহার করে:

arr=(`echo -e "a\nb"`)
echo ${arr[@]}

এটি দেয় a bযা কোনও পাইপ থেকে শেল ভেরিয়েবলে এবং পাইপের পরে পড়া বাশে মানগুলি নির্ধারণ না করে পড়ার মানগুলির উত্তরগুলির দ্বারা প্রদত্ত যে কোনও ওয়ার্কআরআন্ডের চেয়ে সহজ এবং সোজা-এগিয়ে রয়েছে ।


আপনি এটি পরীক্ষা করেছেন?
cmak.fr

@ cmak.fr হ্যাঁ এটি আমার পক্ষে কাজ করে
কোয়ার্ক

@ মিলিবিয়াস আমি এটির একটি ব্যাখ্যা এবং এই ওয়ান লাইনের সুবিধা যুক্ত করেছি।
জিয়াহাও জু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.