Петля не работает - PullRequest
       11

Петля не работает

1 голос
/ 13 марта 2012

Я делаю сценарий, который должен перебрать список файлов с именем как 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

Ответы [ 3 ]

3 голосов
/ 13 марта 2012

В первой строке цикла 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 голосов
/ 13 марта 2012

Я думаю, что это может быть лучшим подходом:

#!/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
3 голосов
/ 13 марта 2012

используйте двойную скобку для арифметики:

#!/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.

...