2010-08-06 5 views
4

Я никогда не делал сценарий оболочки раньше, и теперь у меня возникает простая проблема ... У меня есть цикл for, который выполняется каждый раз при запуске скрипта run.sh. Чтобы увидеть, как далеко уже запущен скрипт, я хочу напечатать, например. каждый 5000 - фактический индекс.для цикла/if условие в сценарии оболочки

$counter = 0 
for (( i = 0 ; i <= 5000; i++ ))do 
    if ($i = $counter); then 
      echo "$counter" 
      counter=$(counter+1000) 
    fi 
./run.sh 
done 

работает этот кусок кода дает мне следующую ошибку

./for_loop.sh: line 1: =: command not found 
./for_loop.sh: line 3: 0: command not found 

Я также пытался инициализировать переменную счетчика с

declare -i counter = 0 

, который дает мне следующую ошибку

./for_loop.sh: line 1: declare: `=': not a valid identifier 
+0

Итак, как мы можем помочь? – Kami

+1

В Bash есть два оператора присваивания: '=' и 'let =', поэтому вы можете назначить первый счетчик с 'counter = 0' или' let counter = 0'. 'let' предназначен для использования только с числами, а' = 'работает с любой строкой. –

ответ

6

Вам не нужно два жетона. Один счетчик будет достаточно:

for ((counter = 0; counter <= 5000; counter++)) 
do 
    if ((counter % 1000 == 0)) 
    then 
      echo "$((counter/1000))" 
    fi 
    ./run.sh 
done 

Это выполняет run.sh 5000 раз и выводит значение счетчика каждые 1000 итераций. Обратите внимание, что % является оператором модуля, который вычисляет остаток после деления, а / - это оператор целочисленного деления.

+0

спасибо за хорошее решение! команда echo «% ((счетчик/1000))» фактически выводит% ((счетчик/1000)), а не результат счетчика/1000. Вы знаете, где проблема? – mkn

+0

Упс! '% ((counter/1000))' должен читать '$ ((counter/1000))'. Замените '%' на '$'. Я исправил свой ответ. –

+0

oh, конечно ... мог бы найти это сам :) thx again – mkn

3

Линия 1 должна быть: (Нет $, без лишних пробелов вокруг '=')

counter=0 

Линия 3 должна быть: (квадратные скобки, '-eq', потому что '=' для струнного равенства)

if [ $i -eq $counter ] 

линия 5 должна быть: (Двойные скобки)

counter=$((counter+1000)) 
+2

В цикле for также должна быть точка с запятой между '))' и 'do', или' do' должна быть на следующем линия. –

+0

Вы правы, но по какой-то причине 'for ((..)) do' отлично работает на моей машине (bash 3.2.17). – schot

+0

Как насчет 'for ((..)) do', т. Е. С промежутком между последней закрывающей скобкой и' do'? Возможно, Bash принимает закрывающую скобку в качестве замены разделителя для ';'. –

Смежные вопросы