2012-04-08 23 views
11

बैश स्क्रिप्ट फ़ंक्शन के अंदर बहु-शब्द तर्क पास करें, मुझे स्क्रिप्ट के कमांड लाइन तर्कों के साथ काम करना होगा, और तर्कों की एक और सूची के साथ भी काम करना होगा। तो मैं एक फ़ंक्शन में दो तर्क सूचियों को पारित करने का प्रयास कर रहा हूं, समस्या यह है कि बहु-शब्द तर्क विभाजित हो जाते हैं।एक बैश फ़ंक्शन

function params() 
{ 
    for PARAM in $1; do 
     echo "$PARAM" 
    done 

    echo . 

    for ITEM in $2; do 
     echo "$ITEM" 
    done 
} 

PARAMS="[email protected]" 
ITEMS="x y 'z t'" 
params "$PARAMS" "$ITEMS" 

स्क्रिप्ट बुला मुझे

myscript.sh a b 'c d' 
a 
b 
c 
d 
. 
x 
y 
'z 
t' 

देता है के बाद से वहाँ दो सूचियों वे कार्य करने के लिए एक पूरे के रूप में पारित किया जाना चाहिए बहु-शब्द आइटम का सम्मान करते हुए, सवाल यह है कि, तत्व पुनरावृति करने के लिए कैसे कर रहे हैं सिंगल कोट्स 'सीडी' और 'जेड टी' में संलग्न है?

मेरे पास जो कामकाज है (नीचे देखें) BASH_ARGV का उपयोग करता है इसलिए मुझे फ़ंक्शन में केवल एक ही सूची उत्तीर्ण करने की आवश्यकता है। हालांकि, मैं क्या हो रहा है और उपर्युक्त काम करने के लिए क्या आवश्यक है इसकी बेहतर समझ लेना चाहता हूं।

function params() 
{ 
    for PARAM in "${BASH_ARGV[@]}"; do 
     echo "$PARAM" 
    done 

    echo . 

    for ITEM in "[email protected]"; do 
     echo "$ITEM" 
    done 
} 

params x y 'z t' 

स्क्रिप्ट बुला मुझे

myscript.sh a b 'c d' 
c d 
b 
a 
. 
x 
y 
z t 

देता है ... कौन सा है मैं इसे कैसे की जरूरत है (जिसमें पहली सूची को छोड़कर उलट है, लेकिन वह संतोषजनक होगा मुझे लगता है)

उत्तर

7
function params() 
{ 
    arg=("[email protected]") 

    for ((i=1;i<=$1;i++)) ;do 
     echo "${arg[i]}" 
    done 

    echo . 

    for ((;i<=$#-$1+2;i++)) ;do 
     echo "${arg[i]}" 
    done 
} 

items=(w x 'z t') 
params $# "[email protected]" "${items[@]}" 

मान लीजिए कि आप अपनी स्क्रिप्ट को a b 'c d' के साथ कॉल करते हैं, आउटपुट है:

a 
b 
c d 
. 
x 
y 
z t 
+0

मुझे लगता है ... तो आप फ़ंक्शन में व्यक्तिगत रूप से आइटम पास कर रहे हैं। मुझे लगता है कि एकमात्र जगह जहां बश उद्धरणों का सम्मान करते समय वस्तुओं में एक स्ट्रिंग को विभाजित करता है, जब कमांड लाइन का अर्थ होता है। – haelix

+0

सरणी तत्वों को '" $ {आइटम्स [@]} "' (डबल कोट्स में) के रूप में पास करने की प्रकृति का प्रत्येक तत्व को "$ {आइटम्स [0]}" $ {आइटम्स [1] के रूप में भेजने का प्रभाव होता है। } "" $ {आइटम [2]} ... 'आदि ... यदि आपने इसे' $ {आइटम्स [@]} के रूप में पास किया है, तो आपको उन तत्वों के साथ शब्द विभाजन मिल जाएगा जिसमें व्हाइटस्पेस था। –

1

पीटर.ओ का उत्तर ऊपर काम करता है, और यह एक उदाहरण के साथ, इसके लिए एक मिश्रण है।

मुझे एक फ़ंक्शन या स्क्रिप्ट की आवश्यकता है जो बहु-शब्द तर्क लेगा, जिसका उपयोग तब चल रहे प्रक्रियाओं की सूची को खोजने और तर्कों में से किसी एक को मिलान करने के लिए किया जाएगा। निम्नलिखित स्क्रिप्ट वह करता है। फ़ंक्शन kill_processes_that_match_arguments केवल एक for लूप की आवश्यकता है, क्योंकि मेरी आवश्यकता केवल फ़ंक्शन के सभी तर्कों के सेट पर पुनरावृत्ति करने के लिए थी। काम करने के लिए परीक्षण किया।

#!/bin/bash 

function kill_processes_that_match_arguments() 
{ 
    arg=("[email protected]") 
    unset PIDS_TO_BE_KILLED 

    for ((i=0;i<$#;i++)) 
    do 
     unset MORE_PIDS_TO_KILL 
     MORE_PIDS_TO_KILL=$(ps gaux | grep "${arg[i]}" | grep -v 'grep' | awk '{ print $2 }') 
     if [[ $MORE_PIDS_TO_KILL ]]; then 
      PIDS_TO_BE_KILLED="$MORE_PIDS_TO_KILL $PIDS_TO_BE_KILLED" 
     fi 
    done 

    if [[ $PIDS_TO_BE_KILLED ]]; then 
     kill -SIGKILL $PIDS_TO_BE_KILLED 
     echo 'Killed processes:' $PIDS_TO_BE_KILLED 
    else 
     echo 'No processes were killed.' 
    fi 
} 

KILL_THESE_PROCESSES=('a.single.word.argument' 'a multi-word argument' '/some/other/argument' 'yet another') 
kill_processes_that_match_arguments "${KILL_THESE_PROCESSES[@]}"