Этот вид проблемы является подходящим к awk
:
% awk '/\.1987:/ {gsub(/,.*/, ""); print}' students.txt
Taylor
Sellen
Или, указывая столбец, а не целую строку (помогающий Вам для настройки, должен Вы хотеть включить другие столбцы:
% awk '/\.1987:/ {
gsub(/,$/, "", $1);
print $1;
}' students.txt
Taylor
Sellen
return
значения.Любая передача оценивает как STDOUT:
function factorial {
(( $1 )) &&
echo $(( $1 * $( factorial $(( $1 - 1 )) ) )) ||
echo 1
}
factorial 5
Или return
их:
function factorial {
(( $1 )) || return 1
factorial $(( $1 - 1 ))
return $(( $1 * $? ))
}
factorial 5
echo $?
Оба кода работают в bash
, ksh
(93 верных, никакая идея приблизительно 88) и zsh
, таким образом, я предполагаю да, оболочки действительно поддерживают рекурсию.
Рекурсия - это не зло; до тех пор, пока вы знаете, что происходит внутри, когда вы вызываете функцию, и подводные камни.
Во-первых, убедитесь, что у вас есть условие остановки, которое будет выполняться, когда рекурсивная функция завершит свою задачу. Если вы этого не сделаете, у вас нет рекурсивной функции, а есть бесконечный цикл.
Затем переменные и точки входа. Каждый вызов функции помещает информацию в стек; адрес точки повторного входа (адрес следующей инструкции при возврате функции). Затем вам нужно зарезервировать место для типа возвращаемого значения tge.
Далее следует вопрос объема. Переменные передаются как параметры, а локальные переменные объявлены в функции. Каждый раз, когда вызывается функция, это пространство должно выделяться в стеке и удерживаться там до тех пор, пока оно не будет вытеснено путем возврата к вызывающей функции. Итак, в конечном итоге у вас закончится память стека (условие переполнения стека).
Я написал программу «Ханойские башни» для класса паскаль, который преподавался на DEC Vax. Я попытался создать условие, которое приведет к сбою моей программы или VMS, если я смогу добавить столько полюсов и столько колец, сколько я хотел. Я получил 1000 колец на 3 полюса, а программа все еще работала. На пробежку ушло минут 10, но я побежал.
В любом случае, вернемся к вашему вопросу. Кажется, что здесь происходит то, что ваши переменные находятся в неправильной области видимости - похоже, что они вызываются в глобальной среде, а не в локальной. Таким образом, любые изменения, внесенные функцией в переменную, отражаются во всех экземплярах функции.Все изменения необходимо вносить в локальную область видимости, а затем значения возвращать вызывающей функции. Я не уверен, поддерживает ли интерпитивный язык, такой как bash, локальные переменные и может ли каждая переменная сделать видимой для всей логики скрипта.
ksh88
– rahmu 22.08.2012, 18:22return
численные значения, которые могли быть выше, чем 255. Используйте STDOUT. – l0b0 03.09.2012, 14:18