আমি অনুরূপ একটি পসিক্স ফাংশন লিখেছি, তবে এটি স্বেচ্ছাসেবীর কোড কার্যকর করার ঝুঁকিপূর্ণ নয়:
unexport()
while case ${1##[0-9]*} in ### rule out leading numerics
(*[!_[:alnum:]]*|"") ### filter out bad|empty names
set "" ${1+"bad name: '$1'"} ### prep bad name error
return ${2+${1:?"$2"}} ### fail w/ above err or return
esac
do eval set '"$'"{$1+$1}"'" "$'"$1"'" "$'@\" ### $1 = ( $1+ ? $1 : "" )
eval "${1:+unset $1;$1=\$2;} shift 3" ### $$1 = ( $1:+ ? $2 : -- )
done
এটি যতটা আর্গুমেন্ট সরবরাহ করতে পারে তত পরিচালনা করে। যদি কোনও যুক্তি যদি একটি বৈধ নাম হয় যা অন্যথায় ইতিমধ্যে সেট করা থাকে না তবে তা নিঃশব্দে উপেক্ষা করা হয়। যদি কোনও যুক্তি একটি খারাপ নাম হয় তবে এটি স্টাডারকে লিখতে এবং যথাযথভাবে থামায়, যদিও তার কমান্ড-লাইনে কোনও অবৈধের আগে কোনও বৈধ নাম এখনও প্রক্রিয়া করা হবে।
আমি অন্য উপায় চিন্তা। আমি এটি অনেক ভাল পছন্দ করি।
unexport()
while unset OPTARG; OPTIND=1 ### always work w/ $1
case ${1##[0-9]*} in ### same old same old
(*[!_[:alnum:]]*|"") ### goodname && $# > 0 || break
${1+"getopts"} : "$1" ### $# ? getopts : ":"
return ### getopts errored or ":" didnt
esac
do eval getopts :s: '"$1" -"${'"$1+s}-\$$1\""
eval unset "$1; ${OPTARG+$1=\${OPTARG}#-}"
shift
done
ঠিক আছে, এই দু'জনেই একই কৌশল ব্যবহার করে। মূলত যদি শেল ভার সেট না করে থাকে তবে এটির সাথে একটি রেফারেন্স কোনও +
প্যারামিটার বিস্তারের সাথে প্রসারিত হবে না । তবে যদি সেট করা থাকে - এর মান নির্বিশেষে - একটি প্যারামিটার বিস্তৃতি: যেমন ${parameter+word}
প্রসারিত হবে word
- এবং ভেরিয়েবলের মান নয়। এবং সুতরাং শেল ভেরিয়েবলগুলি স্ব-পরীক্ষা এবং সাফল্যের স্ব-বিকল্প।
তারা স্ব-ব্যর্থও হতে পারে । শীর্ষের ফাংশনে যদি কোনও খারাপ নাম পাওয়া যায় তবে আমি স্থানান্তরিত $1
হয়ে নাল $2
ছেড়ে চলে যাই $1
কারণ পরবর্তী কাজটি আমি করি return
সফল হয় যদি সমস্ত আরগগুলি প্রক্রিয়াজাত করা হয় এবং লুপটি শেষ হয়, বা, আরগটি অবৈধ থাকলে শেলটি হবে প্রসারিত $2
মধ্যে $1:?
যা স্ক্রিপ্টের শেল হত্যা এবং যখন লেখা একটি ইন্টারেক্টিভ এক একটি ইন্টারাপ্ট ফিরে আসবে word
stderr হবে।
দ্বিতীয়টিতে getopts
অ্যাসাইনমেন্ট রয়েছে। এবং এটি কোনও খারাপ নাম বরাদ্দ করবে না - বরং এটি লিখুন এটি স্ট্যাডারকে একটি স্ট্যান্ডার্ড ত্রুটি বার্তা লিখবে। যুক্তিটি $OPTARG
যদি প্রথম স্থানে একটি সেট ভেরিয়েবলের নাম হয় তবে এটি আরগের মান সংরক্ষণ করে । সুতরাং getopts
প্রয়োজনীয় সমস্ত কাজ করার পরে eval
একটি সেটকে OPTARG
যথাযথ কার্যভারে প্রসারিত করা।
mktemp
হলে এটি ব্যবহার করে অস্থায়ী ফাইলে মানটি প্রতিধ্বনিত করতে পারেন এবং মানটি আনসেট করতে পারেন এবং ভেরিয়েবলটি নির্ধারণের জন্য অস্থায়ী ফাইলটি উত্স করতে পারেন। কমপক্ষে একটি অস্থায়ী ফাইল শেল ভেরিয়েবলের বিপরীতে আরও বেশি কম নির্বিচারে নাম তৈরি করা যেতে পারে।