Функция не может влиять на позиционные параметры своей вызывающей стороны. Это дизайном: позиционные параметры предназначены, чтобы быть частными к функции.
Сделайте свою функциональную работу над массивом.
myfunction () {
local _myfunction_arrayname=$1
shift
… # work on the positional parameters
eval "$_myfunction_arrayname=(\"\$@\")"
}
myfunction foo "$@"
set -- "${foo[@]}"
В ksh93 и ударе, существует окольный способ сделать что-то приближающееся путем объединения псевдонима и .
(source
) встроенный с заменой процесса. Пример.
alias myfunction='. <(echo myfunction_body \"\$@\"; echo set -- "\"\${new_positional_parameters[@]}\"")'
Поместите суть работы функции в myfunction_body
и заставьте его установить массив new_positional_parameters
. После вызова к myfunction
, позиционные параметры устанавливаются на значения это myfunction_body
вставляет new_positional_parameters
.
awk
$ some-command | awk '{print "Hi "$1" Bye"}'
sed
$ some-command | sed 's/\(.*\)/Hi \1 Bye/'
Используя awk
:
$ echo -e "John\nBob\nLucy" | awk '{print "Hi "$1" Bye"}'
Hi John Bye
Hi Bob Bye
Hi Lucy Bye
Используя sed
:
$ echo -e "John\nBob\nLucy" | sed 's/\(.*\)/Hi \1 Bye/'
Hi John Bye
Hi Bob Bye
Hi Lucy Bye
Код ниже строки чтений после строки, храня его в переменной LINE
. В цикле каждая строка записывается обратно к стандартному выводу с добавлением "Привет" и "До свидания"
#!/bin/bash
while read LINE ; do
echo "Hi $LINE Bye"
done
Цикл с условием продолжения Bash и каналы:
echo -e "John\nBob\nLucy" | while read n; do echo "hi $n bye"; done
some-command | paste -d\ <(printf '%s\n' Hi Hi Hi) - <(printf '%s\n' why Why WHY??)
– kojiro 05.02.2014, 05:17paste
путь сегодня, ключи 8-) – slm♦ 05.02.2014, 05:20