करो नहीं का उपयोग 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[@]}"