कर कि समारोह में स्थानीय चर करने के लिए तर्क बताए है आम तरीका है, यानी में रुचि रखते हैं getopt -स्टाइल विकल्प पार्सिंग हो सकता है।
copy() {
local arg from to
while getopts 'f:t:' arg
do
case ${arg} in
f) from=${OPTARG};;
t) to=${OPTARG};;
*) return 1 # illegal option
esac
done
}
copy -f /tmp/a -t /tmp/b
दुःख की बात है बैश लंबे विकल्पों को संभाल नहीं कर सकते हैं जो अधिक पढ़े जा सकेंगे, अर्थात्:
copy --from /tmp/a --to /tmp/b
के लिए, आप या तो बाहरी getopt
प्रोग्राम का उपयोग करने की जरूरत है (जो मुझे लगता है कि केवल जीएनयू सिस्टम पर लंबा विकल्प समर्थन है) या हाथ से लंबे विकल्प पार्सर को लागू करें, यानी:
copy() {
local from to
while [[ ${1} ]]; do
case "${1}" in
--from)
from=${2}
shift
;;
--to)
to=${2}
shift
;;
*)
echo "Unknown parameter: ${1}" >&2
return 1
esac
if ! shift; then
echo 'Missing parameter argument.' >&2
return 1
fi
done
}
copy --from /tmp/a --to /tmp/b
,210
यह भी देखें: using getopts in bash shell script to get long and short command line options
तुम भी आलसी हो सकता है, और सिर्फ समारोह, यानी तर्क के रूप में 'चर' पारित:
copy() {
local "${@}"
# ...
}
copy from=/tmp/a to=/tmp/b
और आप ${from}
और स्थानीय चर के रूप में कार्य में ${to}
होगा।
बस ध्यान दें कि नीचे जैसा ही मुद्दा लागू होता है - यदि कोई विशेष चर पारित नहीं होता है, तो यह मूल वातावरण से विरासत में प्राप्त होगा।
copy() {
local from to # reset first
local "${@}"
# ...
}
सुनिश्चित करना है कि ${from}
और ${to}
सेट नहीं होगा जब पारित नहीं: आप की तरह एक 'सुरक्षा लाइन' जोड़ सकते हैं।
और अगर कुछ बहुत बुरा अपने ब्याज की है, तो आप भी वैश्विक चर के रूप तर्क जब समारोह लागू आवंटित कर सकते हैं, यानी:
from=/tmp/a to=/tmp/b copy
तो फिर तुम सिर्फ ${from}
और ${to}
इस्तेमाल कर सकते हैं copy()
फ़ंक्शन के भीतर। बस ध्यान दें कि आपको हमेशा सभी पैरामीटर पास करना चाहिए। अन्यथा, एक यादृच्छिक चर समारोह में रिसाव हो सकता है।
from= to=/tmp/b copy # safe
to=/tmp/b copy # unsafe: ${from} may be declared elsewhere
आप बैश 4.1 (मुझे लगता है कि), आप भी साहचर्य सरणियों का उपयोग कर प्रयास कर सकते हैं। यह आपको नामांकित तर्क पारित करने की अनुमति देगा लेकिन बदसूरत हो जाएगा। की तरह कुछ:
args=([from]=/tmp/a [to]=/tmp/b)
copy args
और फिर copy()
में, आप grab the array नहीं करनी होंगी।
'$ 1' बनाम' $ ARG1' का उपयोग करने के बीच क्या अंतर है? –
@ जोनलिन: मैं $ 1, $ 2 की बजाय अधिक सहज नाम का उपयोग कर सकता हूं। संख्या भ्रमित कर रहे हैं। – Bhushan
क्या आपको वास्तव में सात अनिवार्य पैरामीटर की आवश्यकता है? एक आम दृष्टिकोण विकल्प में जितना संभव हो सके बारी करना होगा, और एक डिफ़ॉल्ट मान प्रदान करना होगा जहां यह समझ में आता है। यह आपकी स्क्रिप्ट को उपयोग करने में बहुत आसान बनाता है यदि आपको इतनी बड़ी संख्या में तर्कों के लिए किसी विशेष स्थितिगत क्रम को याद रखने की आवश्यकता नहीं है, भले ही अधिकांश उपयोगकर्ता अधिकांश समय डिफ़ॉल्ट मानों को ओवरराइड कर दें। – tripleee