簡體   English   中英

循環執行命令以在BASH中打印和執行

[英]Looping over commands to print and execute in 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

但這當然也不是正確的語法。

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

您可以將CMD放在一個數組中嗎?

您需要$ {!parameter}語法,至少可以在bash中使用。 例如

#!/bin/sh

CMD1="ls"
CMD2="pwd"

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

做您想使用的:

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

你們都忘記了seq(1)。 它包含三個參數:seq START INTERVAL END,並產生一個新行分隔列表(介於(包括)START和END之間),因此您可以執行以下操作:

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

也:

如果在host:之后給出了相對路徑,則假定它是登錄用戶的主目錄。 所以你可以這樣做:

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
~$ 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM