Если Вы хотите выполнить команду на первой строке входного текста, необходимо использовать NR==1
шаблон, нет BEGIN
.
awk -F'=' '
NR==1 {
MIN=$2; MAX=$2; print MIN;
}
NR>1 {
if ( $2 > MAX )
{
MAX = $2;
}
...
Как указано @jw013, BEGIN
шаблон - чтобы действия выполнились перед чтением первой строки.
Вы видите точно, при помощи чего выполняется команда set -x
. Довольно глупый пример:
$ echo $(echo "foo 'bar baz' taz\\ jaz")
foo 'bar baz' taz\ jaz
даст:
++ echo 'foo '\''bar baz'\'' taz\ jaz'
+ echo foo ''\''bar' 'baz'\''' 'taz\' jaz
foo 'bar baz' taz\ jaz
Это несколько трудно считать из-за всего выхода. Например, то второе слово:
''
ничем не становится.\'
становится одинарной кавычкой ('
)'bar'
становится bar
так, чтобы параметр был передан как 'bar
. Можно подтвердить с чем-то вроде этого (предположение, что у Вас есть Данные:: Дамп установил, который не является значением по умолчанию, к сожалению), Примечание $(echo…
был скопирован дословно в строку жемчуга:
$ perl -MData::Dump=pp -E 'pp @ARGV' $(echo "foo 'bar baz' taz\\ jaz")
("foo", "'bar", "baz'", "taz\\", "jaz")
Что происходит, вот то, что удар делает разделение слова (базирующийся прочь $IFS
), не парсинг аргумента. Таким образом, к сожалению, вероятно, необходимо использовать eval
, и соглашение со всем риском, который влечет за собой.
$ eval "echo $(echo "foo 'bar baz' taz\\ jaz")"
foo bar baz taz jaz
(Кроме того, я отмечу, если можно заставить команду генерировать свой вывод как список имен, разделенных NUL, который был бы легок иметь дело с использованием xargs -0
и далее, полностью безопасный).
Вы находитесь в редком положении, чтобы иметь список файлов, который находится в формате это xargs
понимает. Таким образом выполненный
command1 | xargs command2
Обратите внимание на это на некоторых вариантах Unix, если вывод command1
огромно, будет невозможно работать command2
со всеми именами файлов из-за предела длины командной строки. Оборотная сторона использования xargs
это, это будет несколько раз выполнять команду вместо того, чтобы правильно сообщить об ошибке. Можно проверить предел длины командной строки с getconf ARG_MAX
.
Попробуйте что-то вроде этого:-
path1="/etc/passwd"
path2="/var/log/secure"
[root@localhost base_filters]# ls -l "$path1" "$path2"
-rw-r--r--. 1 root root 1876 Mar 10 22:15 /etc/passwd
-rw-------. 1 root root 2408 Apr 5 23:09 /var/log/secure
Не знайте, понимаю ли я полностью Ваш вопрос, но maby, это поможет:
$ var=$(echo "'/path/to/dir 1' '/path/to/dir 2' '/path/to/dir 3'") $ echo -n $var | sed "s/^'\(.*\)'\$/\1/g" | sed "s/' '/\x00/g" | xargs -0 command1
Попытайтесь играть вокруг с переменной IFS, так, чтобы пространство не влияло на Ваш сценарий. Я сохранил бы IFS в переменной и после завершающихся действий моего сценария, я восстановлю IFS.
eval "command1 $(command2)"
это.Спасибо! – 1.61803 16.04.2013, 20:22