স্ট্যান্ডার্ড শেড শেল কল করতে পারে না ( জিএনইউ সেড এটি করার জন্য একটি এক্সটেনশন রয়েছে , যদি আপনি কেবল অ-এমবেডড লিনাক্সের বিষয়ে চিন্তা করেন), সুতরাং আপনাকে বাইরে কিছু সেড প্রসেসিং করতে হবে। বেশ কয়েকটি সমাধান রয়েছে; সবার সাবধানতার সাথে উদ্ধৃতি দেওয়া দরকার।
আপনি মানগুলি কীভাবে প্রসারিত করতে চান তা ঠিক এটি পরিষ্কার নয়। উদাহরণস্বরূপ, যদি একটি লাইন হয়
foo hello; echo $(true) 3
নিচের কোনটি আউটপুট হওয়া উচিত?
k=<foo> value=<hello; echo 3>
k=<foo> value=<hello; echo 3>
k=<foo> value=<hello; echo 3>
k=<foo> value=<foo hello
3>
আমি নীচে বেশ কয়েকটি সম্ভাবনা নিয়ে আলোচনা করব।
খাঁটি শেল
আপনি লাইন দ্বারা ইনপুট লাইনটি পড়তে এবং এটি প্রক্রিয়া করতে শেলটি পেতে পারেন। এটি সহজ সমাধান এবং সংক্ষিপ্ত ফাইলের জন্য দ্রুততমও। এটি আপনার প্রয়োজনের নিকটতম জিনিস " echo \2
":
while read -r keyword value; do
echo "k=<$keyword> v=<$(eval echo "$value")>"
done
read -r keyword value
$keyword
লাইনের প্রথম সাদা স্থান-বিস্মৃত শব্দটি সেট করে এবং$value
বাকী লাইন বিয়োগের পিছনে হোয়াইটস্পেসে অনুসরণ করে।
আপনি যদি ভেরিয়েবল রেফারেন্সগুলি প্রসারিত করতে চান তবে কমান্ড বিকল্পের বাইরে কমান্ডগুলি কার্যকর না করে $value
একটি নথির ভিতরে রাখুন । আমার সন্দেহ হয় আপনি সত্যই এটি খুঁজছিলেন।
while read -r keyword value; do
echo "k=<$keyword> v=<$(cat <<EOF
$value
EOF
)>"
done
একটি খোল মধ্যে পাইপ পাইপ
আপনি ইনপুটটিকে শেল স্ক্রিপ্টে রূপান্তর করতে পারেন এবং এটি মূল্যায়ন করতে পারেন। শেড টাস্ক আপ, যদিও এটি এত সহজ নয়। আপনার " echo \2
" প্রয়োজনীয়তার সাথে যাচ্ছেন (নোট করুন যে কীওয়ার্ডে আমাদের একক উদ্ধৃতিগুলি এড়াতে হবে):
sed -e 's/^ *//' -e 'h' \
-e 's/[^ ]* *//' -e 'x' \
-e 's/ .*//' -e "s/'/'\\\\''/g" -e "s/^/echo 'k=</" \
-e 'G' -e "s/\n/>' v=\\</" -e 's/$/\\>/' | sh
এখানে একটি দস্তাবেজ নিয়ে যেতে, আমাদের এখনও কীওয়ার্ডটি (তবে ভিন্নভাবে) এড়িয়ে চলতে হবে।
{
echo 'cat <<EOF'
sed -e 's/^ */k=</' -e 'h' \
-e 's/[^ ]* *//' -e 'x' -e 's/ .*//' -e 's/[\$`]/\\&/g' \
-e 'G' -e "s/\n/> v=</" -e 's/$/>/'
echo 'EOF'
} | sh
আপনার কাছে প্রচুর ডেটা থাকলে এটি দ্রুততম পদ্ধতি: এটি প্রতিটি লাইনের জন্য পৃথক প্রক্রিয়া শুরু করে না।
awk
আমরা একই কাজটি এসডির সাথে সিড ওয়ার্কের সাথে ব্যবহার করেছি। ফলস্বরূপ প্রোগ্রামটি যথেষ্ট বেশি পঠনযোগ্য। " echo \2
" এর সাথে যাচ্ছি :
awk '
1 {
kw = $1;
sub(/^ *[^ ]+ +/, "");
gsub(/\047/, "\047\\\047\047", $1);
print "echo \047k=<" kw ">\047 v=\\<" $0 "\\>";
}' | sh
এখানে একটি নথি ব্যবহার:
awk '
NR==1 { print "cat <<EOF" }
1 {
kw = $1;
sub(/^ *[^ ]+ +/, "");
gsub(/\\\$`/, "\\&", $1);
print "k=<" kw "> v=<" $0 ">";
}
END { print "EOF" }
' | sh