2011-10-14 14 views
6

वर्णन स्ट्रिंग की एक सरणी निष्पादित करें मैं एक सरणी में स्ट्रिंग के रूप में संग्रहीत कमांड लाइनों का एक सेट निष्पादित करने के लिए संघर्ष कर रहा हूं। मेरे कोड इस तरह दिखता है:खोल कमांड

arr=("sudo apt-get update" "sudo apt-get install xxx") 
... 
arr=(${arr[@]} "ln -s /path1 /path2") 
etc... 

# Then I loop on the array of command 
for ((i = 0 ; i < ${#arr[@]} ; i++)) 
do 
    eval ${arr[$i]} 
done 

यह सरणी पर लूप करते हैं, सरणी में संग्रहीत आदेश की संख्या से अधिक है। के रूप में अगर मेरे तार में खाली रिक्त स्थान अधिक तत्वों में सरणी विभाजित एक ठेठ ouput

की तरह इस तरह के
usage: sudo -h | -K | -k | -L | -V 

केवल 'sudo' स्ट्रिंग के भीतर से लिया जाता है इसका मतलब है कि और मैं क्यों समझ में नहीं आता है!

धन्यवाद

+0

क्या आप दिखा सकते हैं कि 'loc_com' कैसे सेट/उपयोग किया जाता है? – chown

+0

जैसा कि कहा गया है, क्या आप इसे कॉल करने से पहले $ {loc_com [$ i]} प्रतिध्वनि डाल सकते हैं। – aayoubi

+0

क्या आप एक परीक्षण केस पोस्ट कर सकते हैं जो बिना संपादन के काम करेगा? –

उत्तर

7

उपयोग ${#arr[@]} सरणी में आइटम्स की संख्या (${arr[@]} शब्द गणना देता है) प्राप्त करने के लिए। का उपयोग करते हुए या तो eval या बैक-टिक (`) निष्पादित करने के लिए आदेश काम करता है:

[ 15:20 [email protected] ~ ]$ cat run_yum_test.sh 
#!/bin/bash 

declare -a arr=("sudo yum search zsh" "sudo yum list zsh") 

for ((i = 0; i < ${#arr[@]} ; i++)); do 
    printf "\n**** Running: ${arr[$i]} *****\n\n" 

    # Run each command in array 
    eval "${arr[$i]}" 

    ### using back-ticks works also 
    #RESULT=`${arr[$i]}` 
    ### Check if the command gave any output 
    #if [ -n "$RESULT" ]; then 
    # echo "$RESULT" 
    #fi 
done 

[ 15:20 [email protected] ~ ]$ ./run_yum_test.sh 

**** Running: sudo yum search zsh ***** 

[sudo] password for jon: 
Loaded plugins: presto, refresh-packagekit 
=========================================================================== Matched: zsh =========================================================================== 
zsh-html.i686 : Zsh shell manual in html format 
autojump-zsh.noarch : Autojump for zsh 
fatrat-czshare.i686 : FatRat plugin enabling CZShare.com downloads and uploads 
gromacs-zsh.noarch : GROMACS zsh support 
python-twisted-core-zsh.i686 : Tab completion for Zsh and Twisted Core 
zsh.i686 : A powerful interactive shell 
environment-modules.i686 : Provides dynamic modification of a user's environment 
plowshare.noarch : CLI downloader/uploader for some of the most popular file-sharing websites 

**** Running: sudo yum list zsh ***** 

Loaded plugins: presto, refresh-packagekit 
Available Packages 
zsh.i686                 4.3.10-6.fc13                 updates 

संपादित करें (अपनी टिप्पणी का जवाब देने की):

सरणी" विस्तार "करने के लिए, मूल डाल उद्धरण में सरणी (${arr[@]}), इसलिए जैसे:

arr=("sudo yum list zsh" "sudo yum search zsh") 
arr=("${arr[@]}" "echo 'TEST'") 

यहाँ यह कार्रवाई में है:

[ 16:06 [email protected] ~ ]$ cat run_yum_test.sh 
#!/bin/bash 

arr=("sudo yum list zsh" "sudo yum search zsh") 
arr=("${arr[@]}" "echo 'TEST'") 

for ((i = 0; i < ${#arr[@]} ; i++)); do 
    printf "\n**** Running: ${arr[$i]} *****\n\n" 
    eval "${arr[$i]}" 
done 


[ 16:06 [email protected] ~ ]$ ./run_yum_test.sh 

**** Running: sudo yum list zsh ***** 
[sudo] password for jon: 
Loaded plugins: presto, refresh-packagekit 
Available Packages 
zsh.i686                 4.3.10-6.fc13                 updates 

**** Running: sudo yum search zsh ***** 

Loaded plugins: presto, refresh-packagekit 
=========================================================================== Matched: zsh =========================================================================== 
zsh-html.i686 : Zsh shell manual in html format 
autojump-zsh.noarch : Autojump for zsh 
fatrat-czshare.i686 : FatRat plugin enabling CZShare.com downloads and uploads 
gromacs-zsh.noarch : GROMACS zsh support 
python-twisted-core-zsh.i686 : Tab completion for Zsh and Twisted Core 
zsh.i686 : A powerful interactive shell 
environment-modules.i686 : Provides dynamic modification of a user's environment 
plowshare.noarch : CLI downloader/uploader for some of the most popular file-sharing websites 

**** Running: echo 'TEST' ***** 

TEST 
+0

ठीक है यह अजीब है क्योंकि यह 'arr = (" sudo apt-get update के लिए काम करता है "" सुडो एपीटी-अपग्रेड ")' लेकिन 'arr =() के लिए नहीं; arr = ($ {arr [@]} "sudo ln -s $ HOME/blabla/usr/bin/blabla") '। यह हमेशा एक जैसा होता है: स्ट्रिंग को विभाजित किया जाता है और खोल प्रत्येक शब्द पर एक eval बनाता है ... – renard

+2

@ user996170 आपको इसे उद्धरणों में रखना होगा: 'arr =(); arr = ("$ {arr [@]}" "sudo ln -s $ HOME/blabla/usr/bin/blabla") '। – chown

+0

बहुत बहुत धन्यवाद! यह काम करता हैं! – renard

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