যদি অফ-সুযোগে আপনি শেলটি পুনরায় ব্যবহারের জন্য কোটগুলি হ্যান্ডেল করার চেষ্টা করছেন তবে আপনি এটি ছাড়া এটি করতে পারেন এগুলি অপসারণ না করে , এবং এটি খুব মৃত:
aq() { sh -c 'for a do
alias "$((i=$i+1))=$a"
done; alias' -- "$@"
}
এই ফাংশন শেলটি আপনার দেওয়া যে কোনও আরগ অ্যারেটিকে উদ্ধৃত করে এবং পুনরাবৃত্তিযোগ্য যুক্তি অনুসারে এর আউটপুট বৃদ্ধি করে।
এখানে এটি কয়েকটি আরগ সহ রয়েছে:
aq \
"here's an
ugly one" \
"this one is \$PATHpretty bad, too" \
'this one```****```; totally sucks'
আউটপুট
1='here'"'"'s an
ugly one'
2='this one is $PATHpretty bad, too'
3='this one```****```; totally sucks'
সেই আউটপুটটি হ'ল dashযা থেকে সাধারণত একক-উদ্ধৃত আউটপুট যেমন নিরাপদ-উদ্ধৃতি '"'"'।bashকরতে হবে '\''।
একক, নন-হোয়াইটস্পেস, নন-নাল বাইটের অন্য একটি একক বাইটের একটি নির্বাচন প্রতিস্থাপন সম্ভবত $IFSএবং এর সাথে কোনও পসিক্স শেলের মধ্যে দ্রুত কাজ করা যেতে পারে $*।
set -f; IFS=\"\'\`; set -- $var; printf %s "$*"
আউটপুট
"some ""crazy """"""""string ""here
সেখানে আমি কেবল printfএটি করেছি যাতে আপনি এটি দেখতে পারেন তবে অবশ্যই যদি আমি এটি করতাম:
var="$*"
... বরং printf কমান্ডের$var আপনি সেখানে আউটপুটে যা দেখতে পাচ্ছেন তা হ'ল।
যখন আমি set -fশেলটি গ্লোব না করার নির্দেশ দিই - যদি স্ট্রিংয়ে এমন অক্ষর থাকে যা গ্লোব নিদর্শন হিসাবে চিহ্নিত করা যায়। আমি এটি করছি কারণ শেল পার্সার ভেরিয়েবলের ক্ষেত্রে ক্ষেত্র বিভাজন সম্পাদন করার পরে গ্লোব নিদর্শনগুলি প্রসারিত করে। গ্লোববিংয়ের মতো পুনরায় সক্ষম করা যায় set +f। সাধারণভাবে - স্ক্রিপ্টগুলিতে - আমার ব্যাং সেট করা আমার পক্ষে এটির মতো দরকারী:
#!/usr/bin/sh -f
এবং তারপরে স্পষ্টভাবে গ্লোববিং সক্ষম করতেset +f যাই হোক না কেন লাইনে আমি এটা করতে পারেন।
ক্ষেত্র বিভাজনগুলি অক্ষরের উপর ভিত্তি করে ঘটে $IFS ।
দুটি ধরণের $IFSমান রয়েছে - $IFSশ্বেতস্থান এবং $IFSঅ-সাদা স্থান। $IFSহোয়াইটস্পেস (স্পেস, ট্যাব, নিউলাইন) সীমাবদ্ধ ক্ষেত্রগুলি একক ক্ষেত্রের ক্রম অনুসারে এলিডে নির্দিষ্ট করা হয়েছে (বা অন্য কোনও কিছুর আগে না থাকলে কিছুই নয়) - তাই ...
IFS=\ ; var=' '; printf '<%s>' $var
<>
তবে অন্যান্য সমস্ত ঘটনা প্রতি একক ক্ষেত্রে মূল্যায়ন করার জন্য নির্দিষ্ট করা আছে - সেগুলি কেটে ফেলা হয় না।
IFS=/; var='/////'; printf '<%s>' $var
<><><><><>
সমস্ত পরিবর্তনশীল সম্প্রসারণ $IFSহ'ল ডিফল্টরূপে, সীমিত ডেটা অ্যারে - সেগুলি অনুসারে পৃথক ক্ষেত্রগুলিতে বিভক্ত হয় $IFS। যখন তুমি" একজনকে উদ্ধৃত করেন আপনি সেই অ্যারে সম্পত্তিটিকে ওভাররাইড করে এবং এটি একটি একক স্ট্রিং হিসাবে মূল্যায়ন করেন।
তাই যখন আমি ...
IFS=\"\'\`; set -- $var
আমি শেলটির আর্গুমেন্ট অ্যারেটির প্রসারণ $IFSদ্বারা উত্পন্ন বহু সীমিত ক্ষেত্রগুলিতে সেট করছি $var। যখন এটি অক্ষরের জন্য তার উপাদান মান প্রসারিত হয় অন্তর্ভুক্ত মধ্যে $IFSহয় হারিয়ে - তারা কেবল পঠন ক্ষেত্র বিভাজক এখন - তারা হয়\0NUL ।
"$*"- অন্যান্য ডাবল-কোটেড ভেরিয়েবল-বিস্তারের মতো - এর ক্ষেত্র-বিভাজন গুণগুলিও ওভাররাইড করে $IFS। কিন্তু ছাড়াও , এটা প্রথম বাইট কর্মের পরিবর্তে $IFS প্রতিটি সীমায়িত ক্ষেত্রের জন্য মধ্যে "$@"। তাই কারণ "ছিল প্রথম মান $IFS সব পরবর্তী বিভেদক পরিণত "মধ্যে "$*"। এবং আপনি এটি বিভক্ত যখন "প্রয়োজন হবে না $IFS। আপনি সম্পূর্ণরূপে অন্য কোনও মানটির $IFS পরে পরিবর্তন করতে পারেন set -- $argsএবং এর নতুন প্রথম বাইটটি এর পরে ক্ষেত্রের ডিলিমিটারদের জন্য প্রদর্শিত হবে "$*"। আরও কী, আপনি এগুলির সমস্ত চিহ্নগুলি সম্পূর্ণরূপে মুছে ফেলতে পারেন:
set -- $var; IFS=; printf %s "$*"
আউটপুট
some crazy string here
tr। BASH এর PE ভাল তবে tr এক্ষেত্রে অনেক দ্রুত। উদাহরণস্বরূপecho "$OUTPUT" | tr -dc '[[:alpha:]]'যেহেতু আপনি কেবলমাত্র