2011-10-14 17 views
6

Próbuję wykonać zestaw wierszy poleceń przechowywanych jako ciągi w tablicy. Mój kod wygląda następująco:Wykonaj tablicę ciągów opisujących polecenie powłoki

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 

Gdy pętle na tablicy, tablica jest większa niż liczba polecenia przechowywanych w nim. Jakby puste przestrzenie w moich strun podzielić tablicę w więcej elementów Typowym ouput jest taki jak

usage: sudo -h | -K | -k | -L | -V 

Oznacza to, że tylko „sudo” pochodzi z wewnątrz łańcucha i nie rozumiem, dlaczego!

Dzięki

+0

Czy możesz pokazać, w jaki sposób 'loc_com' jest ustawiony/używany? – chown

+0

, jak powiedział chown, możesz umieścić echo $ {loc_com [$ i]} przed wywołaniem go. – aayoubi

+0

Czy możesz wysłać testową sprawę, która mogłaby działać bez edycji? –

Odpowiedz

7

Stosować ${#arr[@]} aby uzyskać liczbę elementów w tablicy (${arr[@]} daje liczbę słów). Korzystanie albo eval lub tył kleszcze (`) wykonywanie robót polecenia:

[ 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 

Edycja (aby odpowiedzieć na komentarz):

Do„przedłużyć”tablicę umieścić oryginał array (${arr[@]}) w cudzysłowie, tak jak poniżej:

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

to jest tutaj w akcji:

[ 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

W porządku to dziwne, ponieważ działa dla 'arr = (" sudo apt-get update "" sudo apt-get upgrade ")' ale nie dla 'arr =(); arr = ($ {arr [@]} "sudo ln -s $ HOME/blabla/usr/bin/blabla") '. To zawsze jest to samo: łańcuch jest podzielony, a powłoka robi eval na każdym słowie ... – renard

+2

@ user996170 Musisz umieścić go w cudzysłowie, tak: 'arr =(); arr = ("$ {arr [@]}" "sudo ln -s $ HOME/blabla/usr/bin/blabla") '. – chown

+0

Wielkie dzięki! to działa! – renard

Powiązane problemy