BASH 3 এবং উপরের সম্ভবত সবচেয়ে সহজ এবং সর্বাধিক সুরক্ষিত উপায় হ'ল:
var="string to split"
read -ra arr <<<"$var"
( arr
অ্যারেটি যেখানে স্ট্রিংয়ের বিভক্ত অংশগুলি নিয়ে যায়) বা, যদি ইনপুটটিতে নতুন লাইন থাকতে পারে এবং আপনি কেবল প্রথম লাইনের চেয়ে আরও কিছু চান:
var="string to split"
read -ra arr -d '' <<<"$var"
(দয়া করে স্থানটি নোট করুন -d ''
, এটি ছেড়ে দেওয়া যাবে না) তবে এটি আপনাকে একটি অপ্রত্যাশিত নতুন লাইন দিতে পারে <<<"$var"
(যেহেতু এটি শেষ পর্যন্ত একটি এলএফ যোগ করে))
উদাহরণ:
touch NOPE
var="* a *"
read -ra arr <<<"$var"
for a in "${arr[@]}"; do echo "[$a]"; done
প্রত্যাশিত ফলাফল
[*]
[a]
[*]
যেহেতু এই সমাধানটি (এখানে পূর্ববর্তী সমস্ত সমাধানগুলির বিপরীতে) অপ্রত্যাশিত এবং প্রায়শই নিয়ন্ত্রণহীন শেল গ্লোববিংয়ের ঝুঁকিতে নেই।
এছাড়াও এটি আপনাকে সম্ভবত চাইলে আইএফএসের সম্পূর্ণ ক্ষমতা দেয়:
উদাহরণ:
IFS=: read -ra arr < <(grep "^$USER:" /etc/passwd)
for a in "${arr[@]}"; do echo "[$a]"; done
ফলাফল যেমন:
[tino]
[x]
[1000]
[1000]
[Valentin Hilbig]
[/home/tino]
[/bin/bash]
আপনি দেখতে পাচ্ছেন, স্পেসগুলিও এইভাবে সংরক্ষণ করা যায়:
IFS=: read -ra arr <<<' split : this '
for a in "${arr[@]}"; do echo "[$a]"; done
আউটপুট
[ split ]
[ this ]
দয়া করে নোট করুন যে IFS
BASH এ পরিচালনা করা নিজস্ব নিজস্ব একটি বিষয়, সুতরাং আপনার পরীক্ষাগুলি করুন, এটিতে কিছু আকর্ষণীয় বিষয়:
unset IFS
: এসপিসি, ট্যাব, এনএল এবং লাইনের শুরু এবং শেষের রানগুলি উপেক্ষা করে
IFS=''
: কোনও ক্ষেত্র বিভাজন নয়, কেবল সবকিছু পড়ে
IFS=' '
: এসপিসির চালনা (এবং কেবল এসপিসি)
কিছু শেষ উদাহরণ
var=$'\n\nthis is\n\n\na test\n\n'
IFS=$'\n' read -ra arr -d '' <<<"$var"
i=0; for a in "${arr[@]}"; do let i++; echo "$i [$a]"; done
আউটপুট
1 [this is]
2 [a test]
যখন
unset IFS
var=$'\n\nthis is\n\n\na test\n\n'
read -ra arr -d '' <<<"$var"
i=0; for a in "${arr[@]}"; do let i++; echo "$i [$a]"; done
আউটপুট
1 [this]
2 [is]
3 [a]
4 [test]
BTW:
আপনি যদি $'ANSI-ESCAPED-STRING'
এটিতে অভ্যস্ত না হন তবে এটি টাইমসভার।
আপনি যদি -r
( অন্তর্ভুক্ত read -a arr <<<"$var"
) অন্তর্ভুক্ত না করেন তবে পড়ুন ব্যাকস্ল্যাশ পালাতে পারে। এটি পাঠকের জন্য অনুশীলন হিসাবে রেখে দেওয়া হয়েছে।
দ্বিতীয় প্রশ্নের জন্য:
স্ট্রিংয়ের জন্য কিছু পরীক্ষা করার জন্য আমি সাধারণত case
দৃ to়ভাবে আটকে থাকি কারণ এটি একসাথে একাধিক কেস পরীক্ষা করতে পারে (দ্রষ্টব্য: কেসটি কেবল প্রথম ম্যাচটি সম্পাদন করে, যদি আপনার পতনের জন্য মাল্টিপ্লেস case
স্টেটমেন্ট প্রয়োজন হয়), এবং এই প্রয়োজনটি প্রায়শই ক্ষেত্রে হয় (শ্লেষ) অভিপ্রেত):
case "$var" in
'') empty_var;; # variable is empty
*' '*) have_space "$var";; # have SPC
*[[:space:]]*) have_whitespace "$var";; # have whitespaces like TAB
*[^-+.,A-Za-z0-9]*) have_nonalnum "$var";; # non-alphanum-chars found
*[-+.,]*) have_punctuation "$var";; # some punctuation chars found
*) default_case "$var";; # if all above does not match
esac
সুতরাং আপনি এসপিসির জন্য এটি পরীক্ষা করে ফেরতের মানটি সেট করতে পারেন:
case "$var" in (*' '*) true;; (*) false;; esac
কেন case
? কারণ এটি সাধারণত রেজেক্স সিকোয়েন্সগুলির চেয়ে কিছুটা বেশি পঠনযোগ্য এবং শেল মেটাচার্যাক্টরের জন্য এটি 99% সমস্ত প্রয়োজন খুব ভালভাবে পরিচালনা করে।