বোর্ন / পসিক্স-এর মতো শেলগুলির একটি স্প্লিট + গ্লোব অপারেটর রয়েছে এবং প্রতিবার আপনি প্যারামিটার এক্সপেনশন ( $var
, $-
...), কমান্ড সাবস্টিটিউশন ( $(...)
), বা পাটিগণিতের সম্প্রসারণ ( $((...))
) তালিকার প্রসঙ্গে ছাড়াই রেখে যাবেন।
প্রকৃতপক্ষে, আপনি for name in ${array[@]}
পরিবর্তে এটি করার সময় আপনি ভুলক্রমে এটি শুরু করেছিলেন for name in "${array[@]}"
। (আসলে, আপনার সচেতন হওয়া উচিত যে ভুলরূপে অপারেটরকে অনুরোধ করা অনেকগুলি বাগ এবং সুরক্ষার দুর্বলতার উত্স )।
যে অপারেটর এর মাধ্যমে কনফিগার করা $IFS
বিশেষ প্যারামিটার এবং (কি অক্ষর বিভক্ত (যদিও যে স্থান, ট্যাব হুঁশিয়ার এবং একটি বিশেষ চিকিত্সা আছে) গ্রহণ সম্পর্কে newline বলুন পর্যন্ত) -f
নিষ্ক্রিয় করতে বিকল্প ( set -f
) অথবা সক্রিয় করুন ( set +f
) glob
অংশ।
এছাড়াও মনে রাখবেন যখন S
মধ্যে $IFS
মূলত ছিল (বোর্ন শেল যেখানে $IFS
থেকে আসে) SPOSIX শাঁস এ, eparator, অক্ষর $IFS
বরং হিসেবে দেখা উচিত বিভেদক বা terminators (উদাহরণের জন্য নীচে দেখুন)।
সুতরাং বিভক্ত করতে _
:
string='var1_var2_var3'
IFS=_ # delimit on _
set -f # disable the glob part
array=($string) # invoke the split+glob operator
for i in "${array[@]}"; do # loop over the array elements.
বিভাজক এবং ডিলিমিটারের মধ্যে পার্থক্য দেখতে , চেষ্টা করুন:
string='var1_var2_'
এটি এটিকে কেবল var1
এবং var2
কেবল (অতিরিক্ত খালি উপাদান ছাড়াই) বিভক্ত করবে ।
সুতরাং, এটি জাভাস্ক্রিপ্ট এর অনুরূপ করতে split()
আপনার একটি অতিরিক্ত পদক্ষেপ প্রয়োজন:
string='var1_var2_var3'
IFS=_ # delimit on _
set -f # disable the glob part
temp=${string}_ # add an extra delimiter
array=($temp) # invoke the split+glob operator
(নোট এটি একটি খালি বিভক্ত হবে $string
মধ্যে 1 (না 0 ) উপাদান, জাভাস্ক্রিপ্ট মত split()
)।
বিশেষ চিকিত্সা ট্যাবটি দেখতে, স্থান এবং নিউলাইনটি গ্রহণ করুন, তুলনা করুন:
IFS=' '; string=' var1 var2 '
(যেখানে আপনি পাবেন var1
এবং var2
) সাথে
IFS='_'; string='_var1__var2__'
যেখানে আপনি পাবেন: ''
, var1
, ''
, var2
, ''
।
মনে রাখবেন যে zsh
শেলটি স্প্লিট + গ্লোব অপারেটরটিকে স্পষ্টভাবে অনুরোধ করে না যতক্ষণ না ইনসুলেশন sh
বা ksh
অনুকরণ হয়। সেখানে, আপনি এটি স্পষ্টভাবে প্রার্থনা করতে হবে। $=string
বিভক্ত অংশের $~string
জন্য, গ্লোব অংশের $=~string
জন্য ( উভয়ের জন্য), এবং এর একটি বিভাজন অপারেটরও রয়েছে যেখানে আপনি পৃথককে নির্দিষ্ট করতে পারেন:
array=(${(s:_:)string})
বা খালি উপাদান সংরক্ষণ করতে:
array=("${(@s:_:)string}")
মনে রাখবেন যে বিভাজনেরs
জন্য রয়েছে , সীমানা ছাড়াই নয় (এর সাথে একটি পরিচিত পসিক্স অ-কনফরমেশনও নেই )। এটি জাভাস্ক্রিপ্টের থেকে পৃথক যে একটি খালি স্ট্রিং 0 (1 না) উপাদানকে বিভক্ত করা হয়েছে।$IFS
zsh
split()
$IFS
-স্প্লিটিংয়ের সাথে একটি উল্লেখযোগ্য পার্থক্য হ'ল স্ট্রিংয়ের ${(s:abc:)string}
উপর বিভক্ত হওয়া abc
, যখন এর সাথে IFS=abc
বিভক্ত হবে a
, b
বা c
।
সঙ্গে zsh
এবং ksh93
, বিশেষ চিকিত্সা স্থান, ট্যাব বা সম্পর্কে newline পাওয়া তাদের মধ্যে দ্বিগুন দ্বারা মুছে ফেলা হতে পারে $IFS
।
Historicতিহাসিক নোট হিসাবে, বোর্ন শেল (পূর্বপুরুষ বা আধুনিক পসিক্স শেলস) সর্বদা শূন্য উপাদানগুলিকে ছিনিয়ে নিয়েছিল। এর অ-ডিফল্ট মানগুলির সাথে split @ বিভক্তকরণ এবং প্রসারণ সম্পর্কিত অনেকগুলি বাগ রয়েছে $IFS
। উদাহরণস্বরূপ IFS=_; set -f; set -- $@
সমতুল্য হবে না IFS=_; set -f; set -- $1 $2 $3...
।
রেগেক্সপসে বিভক্ত
এখন জাভাস্ক্রিপ্টের কাছাকাছি এমন কিছু split()
যা নিয়মিত অভিব্যক্তিতে বিভক্ত হতে পারে, আপনাকে বাহ্যিক উপযোগগুলির উপর নির্ভর করতে হবে।
পসিক্স সরঞ্জাম-বুকে awk
একটি split
অপারেটর রয়েছে যা প্রসারিত নিয়মিত অভিব্যক্তিগুলিতে বিভক্ত হয়ে যায় (এগুলি জাভাস্ক্রিপ্ট দ্বারা সমর্থিত পার্ল-এর মতো নিয়মিত এক্সপ্রেশনগুলির কম-বেশি হয়)।
split() {
awk -v q="'" '
function quote(s) {
gsub(q, q "\\" q q, s)
return q s q
}
BEGIN {
n = split(ARGV[1], a, ARGV[2])
for (i = 1; i <= n; i++) printf " %s", quote(a[i])
exit
}' "$@"
}
string=a__b_+c
eval "array=($(split "$string" '[_+]+'))"
zsh
শেল পার্ল সামঞ্জস্যপূর্ণ রেগুলার এক্সপ্রেশনের (তার জন্য সমর্থন builtin হয়েছে zsh/pcre
, মডিউল), কিন্তু এটি ব্যবহার একটি স্ট্রিং বিভক্ত করা সম্ভব যদিও তুলনামূলকভাবে কষ্টকর হয়।
shell
ব্যবহার করছেন, আপনার সাথে যাbash
করতে পারেIFS='_' read -a array <<< "${string}"