2016-07-06 2 views
2

У меня есть сценарий оболочки с различным methods.The сценариемКак разрешить ошибку «shift: can not shift that many» при запуске сценария оболочки?

status(){ 
    PID=$(ps -ef | grep jmeter_script.sh|grep -v grep|awk '{print $2}') 
    } 

    start(){ 
    shift 
    if [ "$#" -ne 2 ]; then 
      exit 1; 
    fi 
    jmeter.sh -n -t "$1" -l "$2" 
    } 

    stop(){ 
     while true; do 
      read -p "Do you really want to stop?" yn 
      case $yn in 
       [Yy]*) ps -ef | grep jmeter | grep -v grep | awk '{print $2}'|xargs kill; break;; 
       [Nn]*) exit;; 
       *) echo "Please answer yes or no.";; 
      esac 
view(){ 
#some code 
} 

    ####Main 
    while [ "$1" != "" ]; do 
    case "$1" in 
      start) 
       start 
       ;; 

      stop) 
       stop 
       ;; 

      status) 
       status 
       ;; 
      view) 
       view 
       ;; 
      *) 
       echo $"Usage: $0 {start|stop|status|view}" 
       exit 1 
      esac 
     shift 
    done 

Когда я пытаюсь запустить скрипт, используя ./jmeter_script.sh start abc.jmx log.jtl я получаю сообщение об ошибке сказав ./jmeter_script.sh: 19: shift: can't shift that many и затем выйти. Я запускаю свой скрипт на сервере ubuntu. Я попытался разрешить это, но я не нашел правильной ссылки для этой ошибки. Кто-то, пожалуйста, помогите.

+0

Вы не можете сдвигать более чем на '$ #'. Когда '$ #' равно 0 (как при вызове 'start'), вы не можете использовать' shift' вообще. Внутри функции '' $ @ "' и т. Д. Являются аргументами вызова функции, а не скрипту в целом. –

+0

@JonathanLeffler Как это исправить? Как изменить условие 'if 'в методе' start() '? или Как изменить метод 'start()' так, чтобы он принимал «аргументы командной строки». – user6348718

+0

@ Кир. Я не понял, что ты сказал. Не могли бы вы объяснить, где я пошла не так? – user6348718

ответ

1

Это функции, а не методы. Не переходите на борт, применяя терминологию OOD, где она не начинает применяться.

Лучший способ избежать сдвиговых ошибок - не переносить, когда у вас закончились аргументы. Проверьте значение $ # ПЕРЕД вы смените.

Было бы проще проанализировать ваш вывод ps -ef, если вы не укажете много флагов. Все, что вам нужно - это PID и PNAME.