Простейший пример странного поведения:
Код: Выделить всё
#!/bin/sh
a="1.2.30.4"
echo "bla-bla" | awk "{print $a}"Код: Выделить всё
#!/bin/sh
a="1.2.30.4"
echo "bla-bla" | awk "{print $a}"А чё тут непонятного? Я хотел, чтобы на выходе было "1.2.30.4" а не "1,20,30,4". Ну, главное было спросить, у меня всегда так - как кому умному вопрос задашь, так ответ сам находится. Разобрался уже. А до того никак простое решение не шло в голову. Переклинило.lissyara писал(а):чё-то я слабо понимаю чё ты вообще пытался сделать этой конструкцией...
сдаётся мне, что авк тоже не понимает... поэтому и выводит то к чему душа лежит.
Леххко:lissyara писал(а):поделись
Код: Выделить всё
#!/bin/sh
a="1.2.30.4"
echo "bla-bla" | awk "{print \"$a\"}"а при чём тут awk?Vadim писал(а):Хотел передать авку ip-адрес в скрипте и обалдел от такого закидона.
Код: Выделить всё
zg# ./2.sh
awk {print 1.2.30.4}
zg#Код: Выделить всё
zg# awk 'BEGIN{print 1.2.222.2.2.2.2}'
1.20.2220.20.20.20.2
zg#потому что это неправильный вариантVadim писал(а):Но, блин, как уродуют текст эти экранированные кавычки!
Код: Выделить всё
zg# awk -v a="1.2.3.4" 'BEGIN {print a}'
1.2.3.4
zg#Если бы было так просто!zg писал(а):достаточно добавить echo перед вызвом awk и будет показан вызов awk
Мне тоже интересно, что они хотели этим сказать, но интерес уже чисто академический.как видишь, принт идёт без кавычек, при этом точка отделяет дробную часть от целого, что делает вторая точка, понятия не имею, но явно какие-то махинации с числовыми значениями
Это твой вариант неправильный. Нужно выводить не что-то заранее данное, в этом случае просто была бы строка, а параметр извне. Из шелловской переменной в данном случае. Двойные кавычки вместо апострофов вокруг фигурных скобок не зря поставлены. Ты же работаешь с внутренними переменным самого авка. А они не самоценны.потому что это неправильный вариант![]()
толи я такой тупой, то ли ты такой умныйVadim писал(а):А они не самоценны.
Код: Выделить всё
NAME
awk - pattern-directed scanning and processing language
SYNOPSIS
awk [ -F fs ] [ -v var=value ] [ 'prog' | -f progfile ] [ file ... ]
....
ENVIRON
array of environment variables; subscripts are names.Vadim писал(а):Это твой вариант неправильный. Нужно выводить не что-то заранее данное, в этом случае просто была бы строка, а параметр извне.
Код: Выделить всё
zg# setenv A "Hello World!" && awk -v a="$A" 'BEGIN {print a}'
Hello World!
zg#Толи не поняли друг другаzg писал(а):толи я такой тупой, то ли ты такой умныйVadim писал(а):А они не самоценны.
К моему постоянному удивлению, реже. Особенно, если учесть случаи, когда сам ошибки признаюжизнь сложная штука, я бываю неправ 8 из 10 раз, и прекрасно об этом знаю. Сколько раз бываешь неправ ты?
ты из шела коструируешь статичный скрипт авк, но при этом думаешь, что передаёшь авк переменную. Переменную в авк можно передать либо из коммандной строки через -v var=value, либо через глобальную переменную окружения, используя массив ENVIRON, других способов нет. А сконструировать статичный скрипт можно как угодно, хоть шелл, хоть не шелл.Vadim писал(а):Мой вариант-то тоже работает.
Не, не думаю, как оно работает, я понимаю. Просто не все такие умные, как авк, что могут собственные переменные вводить перед запуском и вне основного тела скрипта. Вот по привычке и делаю статику. Шелл, он весь на этом стоит.zg писал(а):ты из шела коструируешь статичный скрипт авк, но при этом думаешь, что передаёшь авк переменную.Vadim писал(а):Мой вариант-то тоже работает.
на кой тебе это? шелл никогда не отличался быстротой, нужна скорость - пиши на C.Vadim писал(а):Пока не могу определить, какой способ быстрее.
Авк воспринимает первое число до точки (1) как целую часть дроби, после точки (2) как дробную часть, потом число (1,2) кончилось и началось следующее число с опущенной целой частью (.222) в локали опущеная часть представляется как 0 вот и получается 0,222 и потом ещё 0,2 и 0,2 и 0,2 и наконец 0,2zg# awk 'BEGIN{print 1.2.222.2.2.2.2}'
1.20.2220.20.20.20.2
zg#
ты чертовски правeZH писал(а):кончилось и началось следующее число с опущенной целой частью (.222)
Код: Выделить всё
zg# awk 'BEGIN{print 1.2 .3}'
1,20,3
zg# awk 'BEGIN{print 1.2, .3}'
1,2 0,3
zg#