2011-10-14 25 views
6

Tôi đang cố gắng thực hiện một tập hợp các dòng lệnh được lưu trữ dưới dạng chuỗi trong một mảng. Mã của tôi trông như thế này:Thực hiện một mảng chuỗi mô tả lệnh 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 

Khi nó vòng qua mảng, mảng lớn hơn số lệnh được lưu trữ vào nó. Như nếu khoảng trống trong chuỗi của tôi chia mảng trong các yếu tố hơn Một ouput điển hình là ví dụ như

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

Điều đó có nghĩa chỉ 'sudo' được lấy từ trong chuỗi và tôi không hiểu tại sao!

Cảm ơn

+0

Bạn có thể chỉ ra cách 'loc_com' được đặt/sử dụng không? – chown

+0

như chown nói, bạn có thể đặt một echo $ {loc_com [$ i]} trước khi gọi nó. – aayoubi

+0

Bạn có thể vui lòng đăng một trường hợp thử nghiệm mà có thể hình dung được mà không cần chỉnh sửa? –

Trả lời

7

Sử dụng ${#arr[@]} để có được số lượng các mục trong mảng (${arr[@]} cung cấp cho các số từ). Sử dụng một trong hai eval hoặc back-ve (') để thực hiện các công trình lệnh:

[ 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 

Chỉnh sửa (để trả lời bình luận của bạn):

Để "mở rộng" mảng, đưa bản gốc mảng (${arr[@]}) trong dấu ngoặc kép, như vậy:

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

đây là nó trong hành động:

[ 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

Đúng là lạ vì nó hoạt động cho 'arr = (" sudo apt-get update "" sudo apt-get upgrade ")' nhưng không phải cho 'arr =(); arr = ($ {arr [@]} "sudo ln -s $ HOME/blabla/usr/bin/blabla") '. Nó luôn luôn giống nhau: chuỗi được tách ra và vỏ tạo thành một eval trên mỗi từ ... – renard

+2

@ user996170 Bạn cần đặt nó trong dấu ngoặc kép, như sau: 'arr =(); arr = ("$ {arr [@]}" "sudo ln -s $ HOME/blabla/usr/bin/blabla") '. – chown

+0

Cảm ơn rất nhiều! nó hoạt động! – renard

Các vấn đề liên quan