2017-05-22 4 views
0

Ich verwende dieses Skript, um virtuelle Maschinen in meinem ESXI 6.5 zu kopieren. Das erste Argument des Skripts ist der Name des zu kopierenden Verzeichnisses.Bash für Schleife Ende Bedingung als Skript-Argument

Ich möchte ein zweites Argument haben, das wäre die Anzahl der Vms, die ich kopieren möchte. Für jetzt muss ich die for-Schleife jedes Mal ändern, wenn ich verschiedene Anzahl von vms kopieren möchte. Das folgende Skript erstellt 20 vms, indem es das Verzeichnis eines VMs kopiert, das als erstes Skriptargument angegeben wurde. Ich laufe es so: ./copy.sh CentOS1 aber möchte so etwas haben: ./copy.sh CentOS1 x wo x ist die Endbedingung in meiner for-Schleife.

#!/bin/sh 

for i in $(seq 1 1 20) 
do 
    mkdir ./$1_$i/ 
    cp $1/* $1_$i/ 
    echo "Copying machine '$1_$i' ... DONE!" 
done 

HINWEIS: Bitte machen Sie nicht andere Lösungen, wie sie gegeben, zum Beispiel hier: https://www.cyberciti.biz/faq/bash-for-loop/, weil ich sie überprüft und sie funktionierte nicht.

Danke.

+3

Sie meinen '$ (seq 1 1 $ 2)'? oder Sie könnten sogar einen Standardwert als $ (seq 1 1 $ {2: -20}) angeben. – ewcz

+0

Keine Sorge; Die Verbindung, die Sie zur Verfügung stellen, ist voller schrecklicher Ratschläge und Beispiele. – chepner

Antwort

2

Verwenden Sie einen C -Style for Schleife, wenn Sie bash verwenden.

for ((i=1; i<=$2; i++)) 
do 
    mkdir "./$1_$i/" 
    cp "$1"/* "$1_$i/" 
    echo "Copying machine '$1_$i' ... DONE!" 
done 

Wenn Sie POSIX-Kompatibilität benötigen (wie von Ihrem shebang impliziert), dann können Sie wahrscheinlich nicht auf seq verlassen wird entweder; Verwenden Sie eine while Schleife.

i=1 
while [ "$i" -le "$2" ]; do 
    mkdir ./"$1_$i" 
    cp "$1"/* "$1_$i" 
    i=$((i+1)) 
done 
+0

, wenn Sie nicht haben 'für (())' dann haben Sie nicht $ (()) 'entweder; Ersetzen Sie das Inkrement durch "let i = i + 1" oder "i = \' expr $ i + 1 \ ". Aber es ist alte Syntax. –

+0

@EdouardThiel Ja, das tust du. '$ ((...))' ist [Teil des POSIX-Standards] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_04). 'let' ist eine 'bash'-Erweiterung, und' i = $ (expr $ i + 1) 'ist vollkommen gültig, aber ineffizient (da es einen externen Prozess hervorbringt, anstatt die Arithmetik in der Shell selbst auszuführen). – chepner

+0

Die zweite Lösung funktionierte in esxi Shell. Vielen Dank! – Katie

1

Trotz Ihrer gegenteiligen Beteuerungen, eine der Lösungen in Ihrem Link gut funktionieren würde:

for ((i=1; i<=$2; i++)); do 
    # body of loop goes here 
done 

würde Schleife von 1 bis zur angegebenen Zahl im zweiten Argumente

+0

ESXI-Shell gibt 'Zeile 2: Syntaxfehler: schlecht für Loop-Variable' – Katie

+0

@Katie Ich bin nicht sicher, welche Shell ESXi verwendet, aber ich wette, es ist nicht 'Bash', es ist wahrscheinlich etwas, das versucht, eine POSIX-Shell zu sein , wie 'sh' oder' Strich' oder ähnlich wäre meine Vermutung. Angenommen, das ist der Fall, verwenden Sie die portable Lösung von chepner –