2017-05-22 7 views
0

として与えられた私は、私のESXI 6.5で仮想マシンをコピーするには、このスクリプトを使用しています。スクリプトの最初の引数は、コピーするディレクトリの名前です。バッシュは、スクリプト引数

2番目の引数は、コピーしたいvmsの数です。今のところ、異なる数のvmsをコピーするたびに、forループを変更する必要があります。以下のスクリプトは、最初のスクリプト引数として与えられたvmのディレクトリをコピーすることによって20のvmsを作成します。私はこれを次のように実行します:./copy.sh CentOS1しかし、このようなものがあります:./copy.sh CentOS1 xここで、xは私のforループの終了条件です。

#!/bin/sh 

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

注:ここで、例えば与えられたもの、のように、解決策のために他を提案しないでください。https://www.cyberciti.biz/faq/bash-for-loop/を私はそれらをチェックして、彼らは動作しませんでしたので。

ありがとうございました。逆に、あなたの抗議にもかかわらず

+3

あなたは '$(seq 1 1 $ 2)'を意味しますか? '$(seq 1 1 $ {2:-20})'としてデフォルト値を指定することもできます。 – ewcz

+0

心配はいりません。あなたが提供するリンクはひどいアドバイスや例がいっぱいです。構文エラー: – chepner

答えて

2

はCを使用しますスタイルforループ、bashを使用している場合。 (あなたのシェバングによって示唆されるように)あなたは、あなたはおそらくseqに頼ることはできませんが、POSIX互換性が必要な場合は

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

利用可能であることのいずれか。 whileループを使用してください。

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

のポータブルソリューションを 'for()'がなく、 '$(())'を持たないものを使用してください。 incrementを 'let i = i + 1'または' i = \ 'expr $ i + 1 \' 'に置き換えてください。しかし古い構文です。 –

+0

@EdouardThielはい、そうです。 '$((...))'は[POSIX標準の一部です](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_04)です。 'let 'は' bash'拡張であり、 'i = $(expr $ i + 1)'は完全に有効だが非効率的である(シェル自身で算術演算を行う代わりに外部プロセスを生成するため)。 – chepner

+0

2番目の解決策はesxiシェルで機能しました。ありがとう! – Katie

1

、あなたのリンクでの解決策の一つが正常に動作します:

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

を第二引数で与えられた1から番号へのループ

+0

ESXIシェルは '行2与えループvariable' – Katie

+0

@Katieに悪いと私はESXiが使用するものシェルわからないんだけど、私はそれは'、それはおそらくPOSIXシェルになろうと何かbash'だいない賭けています'sh'や' dash'などのように私の推測になります。その場合、chepner –

関連する問題