【问题标题】:Bash loop not workingBash循环不起作用
【发布时间】:2012-03-30 03:51:21
【问题描述】:

我正在制作一个脚本,该脚本需要遍历名为的文件列表 如file1、file2、file3,都同名,后缀号递增 根据用户输入。

所以我制作了这个脚本,但是当我输入数字 3 时,她只循环 在 file1 上,它停止了。 为什么?

如何根据用户输入循环遍历 n 个文件?

这是我的脚本:

    #!/bin/bash
    echo "Base name of machines to bring down:"
    read vm
    echo "Number of machines:"
    read num

    COUNTER=0
    while [  $COUNTER -lt $num ]; do
      num=$[$COUNTER+1]
      VBoxManage controlvm $vm$num poweroff
      let COUNTER=COUNTER+1
    done

【问题讨论】:

  • 您将计数器递增两次。这是故意的吗?
  • 你需要检查这一行:num=$[$COUNTER+1]
  • 这是什么? num=$[$COUNTER+1]
  • 顺便说一句:您是否尝试使用 -p(提示)读取:read -p "Number of machines:" num
  • @Niklas,@bpgergo ,我只需要第一个增量中的 num 变量。我不想增加 COUNTER 变量。我只需要在 $vm$num 部分使用 counter+1 值,这是要在命令中使用的机器的名称。由于 COUNTER 从 0 开始,而 vm-s 从 vm1 开始,所以我需要通过将 COUNTER 增加 1 来获取 vm1 中的 1 部分。

标签: linux bash shell loops while-loop


【解决方案1】:

使用双括号进行算术运算:

#!/bin/bash
echo "Base name of machines to bring down:"
read vm
echo "Number of machines:"
read num

let COUNTER=1
while ((  COUNTER <= num )); do
    echo $COUNTER of $num
    let COUNTER=COUNTER+1
done

更新

我修复了脚本,使计数器从 1 开始而不是 0。似乎@toninoj 想从 1 开始,但在他的脚本中,他从 0 开始。

【讨论】:

  • 您也可以使用双括号作为增量。 (( COUNTER++ )).
【解决方案2】:

在 while 循环的第一行将 num 设置为 1,然后在 while 循环的底部将 COUNTER 设置为 2,因此它永远不会执行超过一次。 所以你想要这样的东西:

    #!/bin/bash
    echo "Base name of machines to bring down:"
    read vm
    echo "Number of machines:"
    read num

    COUNTER=1
    while [  $COUNTER -le $num ]; do          
        VBoxManage controlvm $vm$COUNTER poweroff
        let COUNTER=COUNTER+1
    done

【讨论】:

    【解决方案3】:

    我认为这可能是一个更好的方法:

    #!/bin/bash
    
    
    for (( i=1 ; $i <= $1 ; i=i+1 ))   
    do
          VBoxManage controlvm $2$i
    
    done
    

    $1 是传递给脚本的第一个参数。 $2 第二个参数。现在您可以使用

    调用您的脚本
    myscript vlaue vm
    

    当到达 $1 时,脚本将停止,而 $2 是您的 vm 参数。

    我用 echo 命令试过这个

    l1zard@Marvin:~/Downloads> ./test.sh 3 maria
    VBoxManage controlvm maria0
    VBoxManage controlvm maria1
    VBoxManage controlvm maria2
    VBoxManage controlvm maria3
    

    【讨论】:

    • -1:您的脚本不起作用,它充满了错误和冗余。
    • 还不错,应该只是从 1 开始,而不是 0
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多