2016-01-04 2 views
0

Я хочу, чтобы иметь возможность запускать скрипт в оболочке Linux (bash) на определенную продолжительность и спящий режим для другой продолжительности. Я написал что-то вроде следующего фрагмента. Тем не менее, я вижу, что только сон происходит правильно, но выполнение прекращается после первого выполнения.Запуск сценария оболочки на определенную продолжительность

#!/bin/bash 
some_work(){ 
    echo "Working for $1 minutes" 
    if [ $1 -gt 0 ] 
     then 
      echo "Setting timer for $1 minutes" 
      run_end_time=$(($1 * 60)) 
      start_time=SECONDS 
      curr_time=SECONDS 
      while $((curr_time < $((start_time + run_end_time)))) : 
       do 
        #Do some work here 
        curr_time=SECONDS 
       done 
    fi 
} 

sleep_time(){ 
    echo "Sleeping for $1 minutes" 
    sleep $(($1 * 60)) 
} 

if [ $# -gt 1 ] 
    then 
     echo "Starting Steeplechase run for $1/$2" 
     while : 
      do 
       some_work $1 
       sleep_time $2 
     done 
fi 

Ответ, который я получаю ./script.sh: строка 30: 1: не найден. Может, мне здесь что-то не хватает.

+0

Он должен быть 'в то время как ((...)); do' вместо 'while $ ((...)); do'. И двоеточие в конце этой строки должно быть ';' (или может быть удалено, как и все точки с запятой). –

+0

В этой [веб-странице] (http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_09_02.html0) приводятся некоторые примеры – vmachan

+0

@Benjamin W. Я отредактировал фрагмент, чтобы отразить ваше предложение, но не обнаружил разницы в поведение. – Ananth

ответ

0

Несколько вопросов:

  • Условная конструкция является while ((...)); do и не while $((...)); do
  • Двоеточие в конце вашей линии

    while $((curr_time < $((start_time + run_end_time)))) : 
    

    не должны быть там.

  • Вы назначаете строку SECONDS, если хотите значение переменной; задания должны выглядеть как var=$SECONDS вместо var=SECONDS.

Полный сценарий с несколькими предложениями и моя идея отступа:

#!/bin/bash 

some_work() { 
    echo "Working for $1 minutes" 
    if (($1 > 0)); then 
     echo "Setting timer for $1 minutes" 
     run_end_time=$(($1 * 60)) 
     start_time=$SECONDS 
     curr_time=$start_time # Want this to be the same value 
     while ((curr_time < $((start_time + run_end_time)))); do 
      #Do some work here 
      curr_time=$SECONDS 
     done 
    fi 
} 

sleep_time() { 
    echo "Sleeping for $1 minutes" 
    sleep $(($1 * 60)) 
} 

if (($# > 1)); then 
    echo "Starting Steeplechase run for $1/$2" 
    while true; do 
     some_work $1 
     sleep_time $2 
    done 
fi 
Смежные вопросы