2009-09-25 4 views
0

Я написал в скрипте bash следующую функцию, но она не работает. Я пропустил что-то очевидное?Вложенный корпус в сценарии bash

main_menu() { 
dialog \ 
    --title "Sim Gateway Infomation Utility" \ 
    --menu "What do you want to do?" 12 60 5 \ 
    Summary "View overall summary" \ 
    Details "View details of a sim bank" \ 
    Modify "Modify used minutes of a sim" \ 
    Exit "Exit" \ 
    2>$tempfile 

retval=$? 
case retval in 
    0) 

     choice=`cat $tempfile` 
     case $choice in 
      Summary) summary;; 
      Details) details;; 
      Modify) modify;; 
      Exit) clean_up;; 
     esac 
     ;; 
    1) 
     confirm_exit;; 
    255) 
     confirm_exit;; 
esac 

}

ответ

5

Этот article обсуждает dialog; Я не испытываю этого.

Ваш 'case retval in' должен быть 'case $retval in (или' case "$retval" in).

[@Idelic отмечает, что мой первоначальный ответ был более консервативным, чем необходимо.]

Строка «retval» не соответствует ни одному из вариантов, которые вы перечисляете в своем внешнем случае (используйте параметр «*» для обнаружения неожиданного). Двойные кавычки предотвращают несчастные случаи, если $retval когда-либо содержали пробелы; в целом, рекомендуется использовать двойные кавычки вокруг переменной в операциях case "$var" in (и в большинстве других мест). В этом конкретном случае это не имело бы значения; статус выхода всегда является числом. В заявлении 'case "$choice" in' мне было бы удобнее использовать кавычки вокруг переменной, но вы все равно можете быть в безопасности (мне нужно было бы узнать больше о dialog, чтобы быть уверенным в том, что он делает и создает ли он когда-либо пробелы - или даже ничего).

+0

Конечно! большое спасибо, его удивительное, как вы можете смотреть сценарий на века и пропустить самую очевидную опечатку! cheers чувак! – Morchuboo

+1

Двойные кавычки не нужны для простых «case $ VAR in ...» операторов. Есть как минимум два случая, когда вам не нужны котировки: простое назначение (FOO = $ BAR) и «case ... in» выше. – Idelic

+0

@Idelic: interesting - Я только что проверил оболочки Korn и Bourne (из Solaris 10), а для заданий вы правы. Я не проверял дело. Где-то за последние двадцать пять лет (и это было в тусклом далеком прошлом, а не в живой памяти) я был сожжен некоторыми из этого. Будь то более старые версии оболочек, или недоразумения, или более сложные вещи с «eval», я не помню сейчас - это печально, что для вас старость. Я немного переформатирую ответ, чтобы отметить ваш комментарий. –

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

  • Нет связанных вопросов^_^