2013-06-21 9 views
17

पर सरणी तर्क कैसे पास करें यह आश्चर्यजनक है कि मुझे इसके लिए 1 घंटे की खोज के बाद उत्तर नहीं मिला। मैं इस तरह मेरी स्क्रिप्ट के लिए एक सरणी पारित करने के लिए करना चाहते हैं:बैश स्क्रिप्ट

array=(a b c) 
for i in "${array[@]}" 
do 
    test.sh argument1 $i argument2 
done 
+0

यह भी देखें कि http://stackoverflow.com/a/1063367/2235132 – devnull

उत्तर

17

बैश सरणियों के रूप में बच्चे प्रक्रियाओं के लिए सरणी चर निर्यात नहीं करता है "प्रथम श्रेणी मूल्यों" नहीं कर रहे हैं - आप उन्हें चारों ओर एक "बात" की तरह पारित नहीं कर सकते हैं।

मान लिया जाये कि test.sh एक bash स्क्रिप्ट है, मैं

#!/bin/bash 
arg1=$1; shift 
array=("[email protected]") 
last_idx=$((${#array[@]} - 1)) 
arg2=${array[$last_idx]} 
unset array[$last_idx] 

echo "arg1=$arg1" 
echo "arg2=$arg2" 
echo "array contains:" 
printf "%s\n" "${array[@]}" 

करते हैं और तरह

test.sh argument1 "${array[@]}" argument2 
+0

ग्रेट उत्तर। मुझे पता है कि यह 'test.sh argument1 array argument2' की ओपी की आवश्यकता के अनुरूप नहीं है, लेकिन अगर आमंत्रण को' test.sh तर्क 1 तर्क 2 सरणी 'में बदल दिया गया था (सरणी अंतिम है), तो यह कम काम होगा। – doubleDown

+2

अच्छा जवाब। लेकिन तकनीकी रूप से यह एक स्क्रिप्ट के लिए सरणी पास नहीं कर रहा है।क्या होगा यदि ओपी को इस स्क्रिप्ट में 'array.sh argument1 array1 array2' जैसे 2 सरणी चर को पारित करने की आवश्यकता है – anubhava

9

इस तरह अपनी स्क्रिप्ट arrArg.sh है:

test.sh argument1 array argument2 

मैं निम्नलिखित की तरह एक और बैश लिपि में इस डाल करने के लिए नहीं है चाहता हूँ

#!/bin/bash 

arg1="$1" 
arg2=("${!2}") 
arg3="$3" 
arg4=("${!4}") 

echo "arg1=$arg1" 
echo "arg2 array=${arg2[@]}" 
echo "arg2 #elem=${#arg2[@]}" 
echo "arg3=$arg3" 
echo "arg4 array=${arg4[@]}" 
echo "arg4 #elem=${#arg4[@]}" 

अब सेटअप एक खोल में इस तरह से अपनी सरणियों:

arr=(ab 'x y' 123) 
arr2=(a1 'a a' bb cc 'it is one') 

और पारित तर्क इस तरह:

. ./arrArg.sh "foo" "arr[@]" "bar" "arr2[@]" 

स्क्रिप्ट से ऊपर प्रिंट होगा:

arg1=foo 
arg2 array=ab x y 123 
arg2 #elem=3 
arg3=bar 
arg4 array=a1 a a bb cc it is one 
arg4 #elem=5 

नोट: यह अजीब है कि मैं . ./script सिंटैक्स का उपयोग स्क्रिप्ट पर कार्य कर रहा हूँ प्रकट हो सकता है। ध्यान दें कि यह वर्तमान शैल पर्यावरण में स्क्रिप्ट के कमांड निष्पादित करने के लिए है।

प्रश्न वर्तमान शैल पर्यावरण क्यों और एक उप खोल क्यों नहीं?
क्योंकि बैश documented here by bash author himself

+5

क्या होगा यदि किसी भी सरणी तत्वों में व्हाइटस्पेस होता है? –

+1

यह गरीब आदमी का दृष्टिकोण है। – devnull

+0

@glennjackman: मेरा दृष्टिकोण बदल गया, कृपया जांचें। – anubhava

-3

यह आह्वान है कि इस अपने आदेश है:

test.sh argument1 ${array[*]} argument2 

आप सरणी पढ़ सकते हैं test.sh में इस तरह:

arg1=$1 
arg2=${2[*]} 
arg3=$3 

यह आपको शिकायत करेगा ("खराब प्रतिस्थापन"), लेकिन काम करेगा।

संबंधित मुद्दे