2015-02-03 3 views
0

Я создал скрипт, который нуждался в некоторой интерактивности в нем, так что я сделал следующую функцию:оболочки - передача имени функции в качестве параметра

function check(){ 
    echo $1 
    read ans 
    if [ -z $ans ] || [ $ans = "y" ]; then 
     $2 ${*:3} 
    fi 
} 

Теперь я могу использовать это с:

check "shall I greet?" say_hello oz123 stackoverflow 
check "Do you leave?" say_goodbye 

Учитывая функции:

function say_hello(){ 

    echo hello $1 
    echo hello $2 

} 

function say_goodbye(){ 
    echo "Goodbye..." 
} 

я придумал check простым суда, расстойки, если Я могу дать имя функции в качестве параметра для функции. Видимо, это работает, но я не понимаю, почему. Можете ли вы объяснить, почему?

+0

Когда вы пишете 'say_goodbye' в приглашении' $ '(или что-то еще), вы используете команду по имени строки. Почему бы не работать с другой функцией? –

+0

Я ожидал, что оболочка сначала оценит функцию, но, по-видимому, оболочка умнее, чем я думал. – Oz123

+1

Вы не говорите оболочке, чтобы оценить любую функцию (не то, что это действительно даже вещь). Вы пишете слово. Слова - это только команды, когда они начинают линию. Подумайте о «echo echo word»? Это не отображает 'word', он отображает' echo word' и т. Д. Сравните это с 'echo $ (echo word)' хотя (там, где вы явно сообщаете оболочке для запуска команды из части вашей строки). –

ответ

1

Расширять комментарий этан, вот то, что человек Баш говорит именно:

SHELL грамматику

Simple Commands 
A simple command is a sequence of optional variable assignments 
followed by blank-separated words and redirections, and terminated by a 
control operator. The first word specifies the command to be executed, 
and is passed as argument zero. The remaining words are passed as 
arguments to the invoked command. 

Если бы я знал это раньше, это может сделать Баш скрипты гораздо больше построены и проще писать и читать.

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