2009-07-29 113 views
2

在bash,我想做的事情是这样的:循环执行命令,打印和BASH执行

#!/bin/bash                  

HOST="blah" 
USER="foo" 
REMOTE_ROOT="${HOST}:~${USER}/" 

REP_NAME=`basename $1` 
TARGET_NAME="${REP_NAME}.git" 

CMD1="git clone --bare $1 $TARGET_NAME" 
CMD2="touch ${TARGET_NAME}/git-daemon-export-ok" 
CMD3="scp -r $TARGET_NAME $REMOTE_ROOT" 
CMD4="rm -rf $TARGET_NAME" 

for i in {1..4} 
do 
    CMD="${CMD${i}}" 
    echo "$CMD" 
    `$CMD` 
done 

也就是说,我要循环命令的列表,显示所执行的命令,然后执行它。

我不知道如何做双取消引用(CMD =“$ {CMD $ {i}}”在BASH中不合法)。

或者,我很乐意做这样的事情:

for CMD in "CMD1 CMD2 CMD3 CMD4" 
do 
    echo $$CMD 
done 

当然,这是不正确的语法,但是,无论是。

回答

3
CMDS[1]="git clone --bare $1 $TARGET_NAME" 
CMDS[2]="touch ${TARGET_NAME}/git-daemon-export-ok" 
CMDS[3]="scp -r $TARGET_NAME $REMOTE_ROOT" 
CMDS[4]="rm -rf $TARGET_NAME" 

# ... 

for x in 1 2 3 4 
do 
    ${CMDS[x]}; 
done 
+0

当然。我只是忘记了如何在bash中做数组。谢谢! – 2009-07-29 22:14:59

0

做你想做什么用:

 
for i in 1 2 3 4; do 
    eval cmd='$'CMD$i 
    echo $cmd 
    eval $cmd 
done 

对于您的替代解决方案,你可以使用eval:{!参数}

 
for CMD in CMD1 CMD2; do 
    eval '$'$CMD 
done 
1

你想要$语法,工作在bash atleast。例如

#!/bin/sh 

CMD1="ls" 
CMD2="pwd" 

for CMD in {CMD1,CMD2} ; do 
    echo ${!CMD} 
    ${!CMD} 
done 
0

你们都忘了seq(1)。它有三个参数:SEQ发车间隔结束并产生(包含性)START和END之间的一个新行分隔的列表,所以你可以这样做:

for i in `seq 1 1 4` 
do 
    echo... 

也:

如果相对路径后给予host:,它被认为是登录用户的主目录。所以你可以这样做:

REMOTE_ROOT="${HOST}:" 
+0

如果你只想增加1,你可以用`seq 1 4`缩写它` – 2009-07-30 20:07:22

0

这更是一个调试/故障排除功能,而并不完全回答你的问题,但我觉得它有用:

#!/bin/bash 

# Enable command echoing 
set -x 

pwd 
uname -a 

# Disable command echoing 
set +x 

echo 'Command echoing off now' 

实例运行:

~$ ./foo.sh 
+ pwd 
/home/jason 
+ uname -a 
Linux jpc 2.6.26-2-amd64 #1 SMP Sun Jun 21 04:47:08 UTC 2009 x86_64 GNU/Linux 
+ set +x 
Command echoing off now 
~$ 

或者,如果你也有类似的文件:

#!/bin/bash 

pwd 
uname -a 

你可以使用bash -x做同样的事情,而不必修改文件:

~$ bash -x ./bar.sh 
+ pwd 
/home/jason 
+ uname -a 
Linux jpc 2.6.26-2-amd64 #1 SMP Sun Jun 21 04:47:08 UTC 2009 x86_64 GNU/Linux 
~$ 
+0

这不是我问的,但它实际上是做我想做的事的一种更好的方式。谢谢! – 2009-07-31 15:47:43