$@
, $*
, $1
, $2
и т. Д. - это аргументы , которые передаются в функцию.Например, в myfunc foo bar baz
у нас есть $ 1 == foo, $ 2 == bar и $ 3 == baz.
Когда вы передаете данные в свою функцию, вы должны извлечь их из stdin:
myfunc() {
data=$(cat)
echo "I received: >$data<"
}
for n in {1..5}; do echo "x=$n"; done | myfunc
производит
I received: >x=1
x=2
x=3
x=4
x=5<
varName=$(cat $2 $3 $4)
работает, потому что $ 2 $ 3 и $ 4 пусты , поэтому оболочка видит это:
varName=$(cat )
Причина, по которой cat "работает только один раз", заключается в том, что вы потребляете поток.Как только вы его потребляете, его уже нет. «Вы не можете съесть свой торт и иметь его тоже».
Функция printArguments
может использовать команду readarray
для захвата входящих строк в массив,вместо использования cat
для захвата всего входящего текста в переменную:
printArguments() {
readarray -t lines
echo "I have ${#lines[@]} lines"
echo "they are:"
printf ">>%s\n" "${lines[@]}"
}
{ echo foo; echo bar; echo baz; } | printArguments
выводит
I have 3 lines
they are:
>>foo
>>bar
>>baz
Чтобы узнать больше, введите help readarray
в интерактивной подсказке bash.