在命令上循环以在BASH中打印和执行

在命令上循环以在BASH中打印和执行,bash,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" CM

在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

当然,这也不是正确的语法。

你能把你的CMD改成一个字母吗?

要做你想做的事,请使用:

for i in 1 2 3 4; do eval cmd='$'CMD$i echo $cmd eval $cmd done 我在1234;做 eval cmd='$'cmd$i echo$cmd eval$cmd 完成 对于备用解决方案,您可以使用eval:

for CMD in CMD1 CMD2; do eval '$'$CMD done 对于CMD1 CMD2中的CMD;做 求值“$”$CMD 完成
您需要${!parameter}语法,至少可以在bash中使用。e、 g

#!/bin/sh

CMD1="ls"
CMD2="pwd"

for CMD in {CMD1,CMD2} ; do
    echo ${!CMD}
    ${!CMD}
done
你们都忘了第(1)项。它有三个参数:seq START INTERVAL END,并生成一个新行分隔的开始和结束列表,因此您可以执行以下操作:

for i in `seq 1 1 4`
do
   echo...
此外:

如果在
主机:
之后给出了相对路径,则假定它是登录用户的主目录。所以你可以做:

REMOTE_ROOT="${HOST}:"

这更多的是一个调试/故障排除功能,并不能完全回答您的问题,但我发现它很有用:

#!/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
~$ 

当然我刚刚忘记了如何在bash中创建数组。谢谢如果你只想增加1,你可以用
seq 14
速记,这不是我要求的,但事实上这是做我想做的事情的更好的方法。谢谢
~$ 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
~$