作为脚本参数给出的循环结束条件的Bash

时间:2017-05-22 13:27:52

标签: bash for-loop

我使用此脚本在我的ESXI 6.5中复制虚拟机。脚本的第一个参数是要复制的目录的名称。

我想要第二个参数,这就是我要复制的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/,因为我检查了它们并且它们没有工作。

感谢。

2 个答案:

答案 0 :(得分:2)

如果您使用的是for,请使用C风格的bash循环。

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

如果您需要POSIX兼容性(正如您的shebang所暗示的那样),那么您可能无法依赖seq可用;使用while循环。

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

答案 1 :(得分:1)

尽管您提出了相反的抗议,但您链接中的解决方案之一可以正常运行:

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

将从1循环到第二个参数中给出的数字