2009-07-29 112 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