2011-10-14 3 views
6

Tengo dificultades para ejecutar un conjunto de líneas de comando almacenadas como cadenas en una matriz. Mi código es el siguiente:Ejecutar una matriz de cadena que describe el comando de shell

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 

Cuando se recorre el array, la matriz es mayor que el número de orden almacenada en él. Como si los espacios en blanco en mis cadenas se reparten el array en más elementos Un ouput típico es tal como

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

Eso significa que sólo 'sudo' está tomada desde dentro de la cadena y no entiendo por qué!

Gracias

+0

¿Puede mostrar cómo se configura/usa 'loc_com'? – chown

+0

como dijo chown, puedes poner un echo $ {loc_com [$ i]} antes de llamarlo. – aayoubi

+0

¿Puede por favor publicar un caso de prueba que podría funcionar sin editar? –

Respuesta

7

Use ${#arr[@]} para obtener el número de elementos de la matriz (${arr[@]} da el número de palabras). Utilizando ya sea eval o back-garrapatas (`) para ejecutar el comando funciona:

[ 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 

Edit (para responder a su comentario):

para "extender" la matriz, poner el original array (${arr[@]}) entre comillas, así:

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

Aquí está en acción:

[ 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

Es extraño porque funciona para 'arr = (" sudo apt-get update "" sudo apt-get upgrade ")' pero no para 'arr =(); arr = ($ {arr [@]} "sudo ln -s $ HOME/blabla/usr/bin/blabla") '. Siempre es lo mismo: la cadena está dividida y el shell realiza una evaluación en cada palabra ... – renard

+2

@ user996170 Debe ponerlo entre comillas, así: 'arr =(); arr = ("$ {arr [@]}" "sudo ln -s $ HOME/blabla/usr/bin/blabla") '. – chown

+0

¡Muchas gracias! ¡funciona! – renard

Cuestiones relacionadas