2012-10-03 12 views
94

में किसी सरणी में कमांड लाइन तर्कों को कनवर्ट करें I कमांड-लाइन तर्कों को बैश स्क्रिप्ट सरणी में कैसे परिवर्तित करूं?बैश

मैं इस ले जाना चाहते हैं:

./something.sh arg1 arg2 arg3 

और यह

myArray=(arg1 arg2 arg3) 
तो

में बदलने का है कि मैं पटकथा में आगे उपयोग के लिए myArray उपयोग कर सकते हैं।

यह पिछले अतः पद करीब आता है, लेकिन कैसे एक सरणी बनाने के लिए में जाने नहीं करता है: How do I parse command line arguments in Bash?

मैं एक नियमित बैश स्क्रिप्ट सरणी में तर्क कन्वर्ट करने के लिए की जरूरत है; मुझे एहसास है कि मैं अन्य भाषाओं का उपयोग कर सकता हूं (उदाहरण के लिए पायथन) लेकिन इसे बाश में करने की ज़रूरत है। मुझे लगता है कि मैं एक "संलग्न" समारोह या कुछ समान खोज रहा हूं?

अद्यतन:

if [ "$#" -eq 0 ]; then 
    myArray=(defaultarg1 defaultarg2) 
else 
    myArray=("[email protected]") 
fi 

उत्तर

126

वास्तव में अपने आदेश पंक्ति तर्क: मैं भी शून्य तर्क के लिए जाँच करने के लिए कैसे और एक डिफ़ॉल्ट सरणी मान निर्दिष्ट करके नीचे इस सवाल का जवाब करने के लिए धन्यवाद, यह काम कर प्राप्त करने में सक्षम था पूछना चाहते व्यावहारिक रूप से पहले से ही एक सरणी की तरह हैं। कम से कम, आप [email protected] वैरिएबल का उपयोग सरणी की तरह कर सकते हैं। जैसा कि कहा गया है, तो आप इसे इस तरह एक वास्तविक सरणी में परिवर्तित कर सकते हैं:

myArray=("[email protected]") 

तुम सिर्फ कुछ तर्क टाइप करें और उन्हें [email protected] मूल्य में फ़ीड चाहते हैं, set का उपयोग करें:

$ set -- apple banana "kiwi fruit" 
$ echo "$#" 
3 
$ echo "[email protected]" 
apple banana kiwi fruit 

समझना कैसे करने के लिए तर्क संरचना का उपयोग विशेष रूप से POSIX sh में उपयोगी है, जिसमें सरणी की तरह कुछ और नहीं है।

+1

धन्यवाद! बहुत अच्छा काम करता है! बस पूछने वाले थे कि शून्य तर्कों की जांच कैसे करें और डिफ़ॉल्ट सरणी मान असाइन करें, और $ # इसके लिए पूरी तरह से काम करता है! – Suman

+0

@kojiro सेट का अर्थ क्या है - धन्यवाद – mailzyok

+1

'सेट' आपको दायरे के लिए स्थितित्मक पैरामीटर सेट करने की अनुमति देता है। यह आपको शैल विकल्प सेट करने देता है। आप 'foo' सेट कर सकते हैं, जिसका अर्थ है' $ 1' "foo" तक फैला है, लेकिन यदि आपके पैरामीटर डैश 'सेट' से शुरू होते हैं तो आपको लगता है कि एक शेल विकल्प सेट करना है। डबल-डैश सुनिश्चित करता है कि निम्नलिखित सभी पैरामीटर को सेट करने के लिए स्थितित्मक पैरामीटर के रूप में व्याख्या किया गया है। – kojiro

35

हो सकता है कि यह मदद कर सकते हैं:

myArray=("[email protected]") 

भी आप तर्क से अधिक पुनरावृति कर सकते हैं 'में' को छोड़ते हुए द्वारा:

for arg; do 
    echo "$arg" 
done 

बराबर

for arg in "${myArray[@]}"; do 
    echo "$arg" 
done 
+0

मुझे लगता है कि दूसरा शानदार है – goofansu

+0

न्यूबी प्रश्न: बैश को कैसे पता चलता है कि 'arg' फ़ील्ड में क्या रखा जाए - क्या यह एक पूर्वनिर्धारित चर है? 'var {var}' 'var' की सामग्री में विस्तारित किया गया है। '$ {var [n]} 'सरणी' var' के तत्व 'n' की सामग्री में विस्तारित किया गया है। '$ {Var [@]}' फिर पूरे सरणी का विस्तार कर रहा है, यानी '$ {var [0]} $ {var [1]} ... $ {var [n]}' ('n'being के साथ अंतिम तत्व की अनुक्रमणिका)? – Christian

+0

[के लिए] बिना [इन] तर्क के सरणी $ @ ($ 1, $ 2, आदि) पर लूप होगा। जिसे [set] कमांड के साथ भी सेट किया जा सकता है, उदाहरण के लिए सेट - arg1 arg2 –

4

यहाँ हो जाएगा एक और उपयोग है:

#!/bin/bash 
array=("[email protected]") 
arraylength=${#array[@]} 
for ((i=1; i<${arraylength}+1; i++)); 
do 
    echo "${array[$i-1]}" 
done 
6

वास्तव में पैरामीटर की सूची $1 $2 ... आदि के साथ उपयोग की जा सकती है।
कौन सा बिल्कुल बराबर है:

${!i} 

तो, मानकों की सूची सेट के साथ बदला जा सकता है,
और ${!i} उन तक पहुँचने के लिए सही तरीका है:

$ set -- aa bb cc dd 55 ff gg hh ii jjj kkk lll 
$ for ((i=0;i<=$#;i++)); do echo "$#" "$i" "${!i}"; done 
12 1 aa 
12 2 bb 
12 3 cc 
12 4 dd 
12 5 55 
12 6 ff 
12 7 gg 
12 8 hh 
12 9 ii 
12 10 jjj 
12 11 kkk 
12 12 lll 

के लिए अपने विशिष्ट मामला, इसका उपयोग किया जा सकता है (सरणी की आवश्यकता के बिना), तर्कों की सूची सेट करने के लिए जब कोई भी नहीं दिया गया था:

if [ "$#" -eq 0 ]; then 
    set -- defaultarg1 defaultarg2 
fi 

जो इस और भी आसान अभिव्यक्ति के लिए अनुवाद:

[ "$#" == "0" ] && set -- defaultarg1 defaultarg2 
4

आसान फिर भी, आप [email protected] पर सीधे काम कर सकते हैं;)

यहाँ कैसे सीधे शीघ्र से आर्ग के आ सूची पारित करने के लिए है:

function echoarg { for stuff in "[email protected]" ; do echo $stuff ; done ; } 
echoarg Hey Ho Lets Go 
    Hey 
    Ho 
    Lets 
    Go