我正在努力执行一组存储为数组中字符串的命令行。 我的代码如下所示:
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
当它遍历数组时,数组大于存储在其中的命令数。好像我的字符串中的空格将数组拆分为更多元素 典型的输出就像
usage: sudo -h | -K | -k | -L | -V
这意味着只有'sudo'取自字符串,我不明白为什么!
由于
答案 0 :(得分:9)
使用${#arr[@]}
获取数组中的项目数(${arr[@]}
给出单词计数)。使用eval
或反向标记(`)执行命令有效:
[ 15:20 jon@host ~ ]$ 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 jon@host ~ ]$ ./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 jon@host ~ ]$ 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 jon@host ~ ]$ ./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