2009-07-29 12 views
2

In BASH drucken und ausführen, möchte ich so etwas wie dies zu tun:über Befehle Looping in 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 

Das heißt, ich Schleife von Befehlen über eine Liste wollen, zeigen Sie den Befehl ausgeführt wird , dann führe es aus.

Ich weiß nicht, wie die doppelte Dereferenzierung zu tun (CMD = "$ {CMD $ {i}}" ist in BASH nicht zulässig).

Alternativ würde ich glücklich sein, etwas zu tun:

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

aber das ist natürlich nicht die richtige Syntax ist, auch nicht.

Antwort

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

Natürlich. Ich hatte gerade vergessen, Arrays in bash zu machen. Vielen Dank! –

1

Können Sie stattdessen Ihre CMDs in eine array setzen?

0

zu tun, was Sie verwenden möchten:

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

Für Ihre alternative Lösung können Sie eval: {! Parameter}

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

Sie die $ wollen Syntax, arbeitet in Bash atleast. z.B.

#!/bin/sh 

CMD1="ls" 
CMD2="pwd" 

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

y'all vergaß seq (1). es hat drei Argumente: seq END START INTERVALL und erzeugt eine neue Zeile getrennte Liste von zwischen (einschließlich) START und END, so dass Sie tun können:

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

auch:

wenn ein relativer Pfad nach gegeben host: wird angenommen, dass es sich um das Home-Verzeichnis des Benutzers handelt. so können Sie einfach tun:

REMOTE_ROOT="${HOST}:" 
+0

Wenn Sie nur um 1 erhöhen möchten, können Sie es mit 'seq 1 4' kurzschließen. –

0

Dies ist eher eine Debug/Funktion zur Fehlerbehebung, und nicht genau Ihre Frage beantworten, aber ich finde es nützlich:

#!/bin/bash 

# Enable command echoing 
set -x 

pwd 
uname -a 

# Disable command echoing 
set +x 

echo 'Command echoing off now' 

Beispiel laufen:

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

Oder wenn Sie hatte eine ähnliche Datei:

#!/bin/bash 

pwd 
uname -a 

Sie könnten bash -x verwenden, um die gleiche Sache zu tun, ohne die Datei zu modifizieren:

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

Das ist nicht das, was ich gefragt habe, aber es ist in der Tat eine bessere Art zu tun, was ich wollte. Vielen Dank! –