2010-12-03 2 views
1

Я работаю над нашим назначением сценариев intro, и у меня возникают проблемы с вызовами функций внутри скрипта. Я во второй части задания, и я просто тестирую, чтобы убедиться, что у меня есть (надеюсь) работа. Я собрал несколько каталогов и задал вопрос «да» или «нет». Когда я получаю «y», я написал небольшую функцию, которую я вызываю, и когда я получаю «n», у меня есть другая функция, как простые эхо-сигналы. В чем проблема?Проблемы с вызовом функции в скрипте bash

part_two(){ 
    answer="" 
    for value in "[email protected]";do 
     echo "$value" 
     while [ "$answer" != "y" -a "$answer" != "n" ] 
     do 
     echo -n "Would you like to save the results to a file? (y/n): " 
     read answer 
     done 
     if [ "$answer" = "n" ] 
     then 
      part_six 
     elif [ "$answer" = "y" ] 
     then 
      part_five 
     fi 
    done 
} 

part_two [email protected] 

part_five(){ 
    echo -n "working yes"; 
} 

part_six(){ 
    echo -n "working no"; 
} 

Любая помощь будет принята с благодарностью, как всегда.

+1

Мы не можем рассказать вам эту проблему, пока вы не сообщите нам о нежелательном поведении, которое вы испытываете. – SiegeX 2010-12-03 07:53:13

ответ

9

Как и в C, функция должна быть определена до ее использования. В своем фрагменте кода вы вызываете part_two (который вызывает part_five и part_six) перед объявлением двух функций.

Вы пытались переместить свои определения в начало сценария?

EDIT:

В большинстве случаев, лучший способ справиться с этим в Bash, чтобы просто определить все функции на старте сценария перед выполнением каких-либо фактических команд. Порядок определений на самом деле не имеет значения - оболочка только ищет функцию, когда она собирается ее использовать, поэтому обычно нет проблем с зависимостями и т. Д., О которых вам, возможно, придется подумать.

EDIT 2:

Там являются случаи, когда вы не можете быть в состоянии только определить функцию в начале сценария. Общий случай, когда вы используете условные конструкции для динамического выбора или изменить объявление функции e..g .:

if [[ "$1" = 0 ]]; then 
    function show() { 
     echo Zero 
    } 
else 
    function show() { 
     echo Not-zero 
    } 
fi 

В этих случаях вы должны убедиться, что каждый вызов функции происходит после этой функции (и любые другие, которые он вызывает) объявляется.

EDIT 3:

В Баш объявление функции на самом деле function foo() { ... } блок, где вы определяете его реализацию - и да, function ключевое слово не является строго необходимым. Нет прототипов функций, как в C - они не имели бы смысла, так как сценарии оболочки обычно анализируются по мере их выполнения. Новая версия Bash действительно читает скрипт сразу, но в основном они проверяют ошибки синтаксиса, а не логические ошибки, такие как этот.

BTW официальным термином является «функция декларация», но даже на информационной странице Bash используются «декларация» и «определение» взаимозаменяемо.

+0

Спасибо. Мы коснулись функций в классе, но только для моментов, не знали о необходимости их определения. – mrwienerdog 2010-12-03 07:59:59

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