करो नहीं का उपयोग eval
! इसमें मनमाना कोड निष्पादन शुरू करने का एक बड़ा जोखिम है।
BashFAQ-50 - मैं एक चर में एक कमांड डालने की कोशिश कर रहा हूं, लेकिन जटिल मामले हमेशा विफल होते हैं।
इसे एक सरणी में रखें और वर्ड स्प्लिटिंग के कारण शब्दों को विभाजित न"${arr[@]}"
करने के लिए डबल-कोट्स के साथ सभी शब्दों का विस्तार करें ।IFS
cmdArgs=()
cmdArgs=('date' '+%H:%M:%S')
और सरणी की सामग्री को अंदर देखें। declare -p
आपको अलग-अलग सूचकांकों में प्रत्येक कमांड पैरामीटर के साथ सरणी की सामग्री को देखने की अनुमति देता है। यदि इस तरह के एक तर्क में रिक्त स्थान होते हैं, तो सरणी में जोड़ते हुए अंदर उद्धृत करना वर्ड-स्प्लिटिंग के कारण विभाजित होने से रोक देगा।
declare -p cmdArgs
declare -a cmdArgs='([0]="date" [1]="+%H:%M:%S")'
और आदेशों को निष्पादित करें
"${cmdArgs[@]}"
23:15:18
(या) पूरी तरह bash
से कमांड चलाने के लिए एक फ़ंक्शन का उपयोग करें ,
cmd() {
date '+%H:%M:%S'
}
और फ़ंक्शन को बस कॉल करें
cmd
POSIX sh
में कोई सरणियाँ नहीं हैं, इसलिए आप जो निकटतम आ सकते हैं, वह स्थितिगत मापदंडों में तत्वों की एक सूची बनाने के लिए है। sh
मेल प्रोग्राम चलाने के लिए यहां POSIX तरीका है
# POSIX sh
# Usage: sendto subject address [address ...]
sendto() {
subject=$1
shift
first=1
for addr; do
if [ "$first" = 1 ]; then set --; first=0; fi
set -- "$@" --recipient="$addr"
done
if [ "$first" = 1 ]; then
echo "usage: sendto subject address [address ...]"
return 1
fi
MailTool --subject="$subject" "$@"
}
ध्यान दें कि यह दृष्टिकोण केवल सरल आदेशों को संभाल सकता है जिसमें कोई पुनर्निर्देशन नहीं है। यह लूप्स, पाइपलाइनों को / जबकि लूप, यदि स्टेटमेंट, आदि के लिए हैंडल नहीं कर सकता है
एक और सामान्य उपयोग का मामला है जब curl
कई हेडर फ़ील्ड और पेलोड के साथ चल रहा है । आप हमेशा नीचे की तरह आर्ग को परिभाषित कर सकते हैं और curl
विस्तारित सरणी सामग्री पर आह्वान कर सकते हैं
curlArgs=('-H' "keyheader: value" '-H' "2ndkeyheader: 2ndvalue")
curl "${curlArgs[@]}"
एक और उदाहरण,
payload='{}'
hostURL='http://google.com'
authToken='someToken'
authHeader='Authorization:Bearer "'"$authToken"'"'
अब जब चर परिभाषित किए जाते हैं, तो अपने कमांड आर्ग को संग्रहीत करने के लिए एक सरणी का उपयोग करें
curlCMD=(-X POST "$hostURL" --data "$payload" -H "Content-Type:application/json" -H "$authHeader")
और अब एक उचित उद्धृत विस्तार करते हैं
curl "${curlCMD[@]}"