বাশের একটি অ্যারেতে সীমানাযুক্ত স্ট্রিং পড়া


206

আমার একটি ভেরিয়েবল রয়েছে যার মধ্যে একটি স্পেস-ডিলিমিট স্ট্রিং রয়েছে:

line="1 1.50 string"

আমি সেই স্ট্রিংটিকে একটি ডিলিমিটার হিসাবে স্পেস দিয়ে বিভক্ত করতে চাই এবং ফলাফলটিকে একটি অ্যারেতে সঞ্চয় করতে চাই, যাতে নিম্নলিখিতটি:

echo ${arr[0]}
echo ${arr[1]}
echo ${arr[2]}

আউটপুট

1
1.50
string

কোথাও আমি একটি সমাধান পেয়েছি যা কার্যকর হয় না:

arr=$(echo ${line})

আমি যদি এর পরে উপরের প্রতিধ্বনিগুলি চালনা করি তবে আমি পাই:

1 1.50 string
[empty line]
[empty line]

আমিও চেষ্টা করেছি

IFS=" "
arr=$(echo ${line})

একই ফলাফল সঙ্গে। দয়া করে কেউ সাহায্য করতে পারেন?


ইউনিক্স এবং লিনাক্স স্ট্যাক এক্সচেঞ্জে এই উত্তরটি দেখুন: হরস্ট্রিং (<<<) দিয়ে সেড ব্যবহার করুন এবং একটি পড়ুনset -f; arr=($string); set +fযতো তাড়াতাড়ি হবে বলে মনে হয় read -r -a <<< $string
কোডফোরস্টার

উত্তর:


331

একটি স্ট্রিংকে অ্যারেতে রূপান্তর করতে, দয়া করে ব্যবহার করুন

arr=($line)

অথবা

read -a arr <<< $line

উদ্ধৃতি ব্যবহার না করা অত্যন্ত গুরুত্বপূর্ণ কারণ এটি কৌশলটি কার্যকর করে।


7
এবং আপনার সুন্দর নতুন অ্যারের একটি স্যানিটি চেক করতে:for i in ${arr[@]}; do echo $i; done
বাঞ্জার

5
বা কেবলecho ${arr[@]}
বাঞ্জার

13
এতে দুটি $lineচরিত্রই যদি অক্ষরে অক্ষরে অক্ষরে থাকে তবে ব্যর্থ হতে পারে । mkdir x && cd x && touch A B C && line="*" arr=($line); echo ${#arr[@]}3
টিনো

3
declare -a "arr=($line)"IFSউদ্ধৃত স্ট্রিংগুলির মধ্যে ডিলিমিটারদের উপেক্ষা করবে
ডেভ

4
@ টিনো নং যখন line='*', read -a arr <<<$lineসর্বদা কাজ করে তবে কেবল arr=($line)ব্যর্থ হয়।
জনি ওয়াং

39

এটা চেষ্টা কর:

arr=(`echo ${line}`);

5
সুন্দর - এই সমাধানটি জেড শেলটিতেও কাজ করে যেখানে উপরের অন্যান্য কয়েকটি পদ্ধতির ব্যর্থতা রয়েছে।
কীথ হুগিট

এটি কাজ করে, আপনি দয়া করে ব্যাখ্যা করতে পারেন কেন এটি কাজ করে?
smartwjw

2
মন্তব্য: লাইনে যখন '*' থাকে তখন এটি কাজ করে না, যেমনline='*'
জনি ওয়াং

34

ইন: arr=( $line )। "বিভক্ত" "গ্লোব" এর সাথে সম্পর্কিত।
ওয়াইল্ডকার্ডগুলি ( *, ?এবং []) ম্যাচিং ফাইলের নামের প্রসারিত করা হবে না।

সঠিক সমাধানটি আরও কিছুটা জটিল:

IFS=' ' read -a arr <<< "$line"

কোন গ্লোববিং সমস্যা নেই; বিভক্ত অক্ষর সেট করা আছে $IFS, ভেরিয়েবল উদ্ধৃত।


5
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। বিবৃতি arr=($line)মধ্যে গৃহীত উত্তর globbing সমস্যা ভুগছেন। উদাহরণস্বরূপ, চেষ্টা করে দেখুন: line="twinkling *"; arr=($line); declare -p arr
কোডফোরস্টার

উদ্ধৃতি এখানে থাকা জন্য optionচ্ছিক, <<<তবে ধারাবাহিকতা এবং পঠনযোগ্যতার জন্য এখনও ডাবল উদ্ধৃতি ব্যবহার করা ভাল ধারণা হতে পারে।
কোডফোরস্টার

6

আপনার যদি প্যারামিটার সম্প্রসারণ প্রয়োজন হয়, তবে চেষ্টা করুন:

eval "arr=($line)"

উদাহরণস্বরূপ, নিম্নলিখিত কোডটি নিন।

line='a b "c d" "*" *'
eval "arr=($line)"
for s in "${arr[@]}"; do 
    echo "$s"
done

তাহলে বর্তমান ডিরেক্টরী ফাইল অন্তর্ভুক্ত a.txt, b.txtএবং c.txtতারপর, কোড নিম্নলিখিত আউটপুট উত্পাদন করবে নির্বাহ।

a
b
c d
*
a.txt
b.txt
c.txt

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