Есть у меня задача составить шаблон "Zabbix" для Cisco Catalyst 6500, все бы ничего, только портов у него много, а в шаблон данные почти все нужно руками прописывать.
Вот собственно и сама заготовка шаблона:
Может кто-то знает как сделать так, чтобы $n и $oid увеличивались на единицу. Но $n - начиная с "1", а $oid - начиная с "79"?
Я пробовал использовать цикл for, но не знаю как ему прописать два значения одновременно. Что-то типа:
Может кто-то знает как сделать так, чтобы $n и $oid увеличивались на единицу. Но $n - начиная с "1", а $oid - начиная с "79"?
Я пробовал использовать цикл for, но не знаю как ему прописать два значения одновременно. Что-то типа:
Может кто-то знает как сделать так, чтобы $n и $oid увеличивались на единицу. Но $n - начиная с "1", а $oid - начиная с "79"?
Я пробовал использовать цикл for, но не знаю как ему прописать два значения одновременно. Что-то типа:
можно было-бы и так сделать. В такой простой задаче сложно сказать что "проще". Не сомневаюсь, что t.t с лёгкостью-бы сделал по своему. ИМХО мне показался этот путь самым простым для понимания, и для модификации.
for (( N=1; N<=133; N++ ))
do
(( OID++ )) # вот тут можно как t.t считать каждый раз, или как я - итеративно вычислять в каждой итерации. Не важно
sed "s/{N}/$N/g; s/{OID}/$OID/g" template >>dest #добавляем модифицированный шаблон к общему файлу
done
Это удобно по двум причинам:
1) мы можем с лёгкостью изменить шаблон, и сгенерировать файл по новой.
2) мы легко можем добавить дополнительные параметры.
[sgf@shilvana ~]$ ./t.sh
real 0m15.656s
user 0m14.415s
sys 0m1.218s
real 0m9.670s
user 0m9.131s
sys 0m0.609s
Для zsh всё более печально:
/tmp/zsh - 1 (Created by format.vim)
(zyx:~/tmp/zsh) % cat for-seqtime ( for ((i= 1; i <= 1000000; ++i)); do echo "$i" done >/dev/null)time ( for i in $(seq 1 1000000); do echo "$i" done >/dev/null)(zyx:~/tmp/zsh) % zsh for-seq ( for ((i= 1; i <= 1000000; ++i)) do; echo "$i"; done > /dev/null; ) 3,26s user 0,74s system 98% cpu 4,075 total^C( for i in $(seq 1 1000000); do; echo "$i"; done > /dev/null; ) 280,09s user 21,13s system 97% cpu 5:07,94 totalzsh for-seq 283,36s user 21,87s system 97% cpu 5:12,02 total(zyx:~/tmp/zsh) % bash for-seqreal0m11.971suser 0m11.627ssys 0m0.272sreal 0m9.107suser 0m9.066ssys 0m0.186sbash for-seq 20,69s user 0,47s system 100% cpu 21,145 total(zyx:~/tmp/zsh) %
пробуйте. Но мне как-бы не нравится, когда вместо обработки чисел 1, 2, 3, 4, и т.д. Я режу строчку "1 2 3 4 5 6 7 8 9 10 11 12..." на кусочки, разделённые пробелом, а потом эти кусочки интерпретирую как числа... ИМХО.
мне как-бы не нравится, когда вместо обработки чисел 1, 2, 3, 4, и т.д. Я режу строчку "1 2 3 4 5 6 7 8 9 10 11 12..." на кусочки, разделённые пробелом, а потом эти кусочки интерпретирую как числа... ИМХО.
Оно всегда и везде так. Ничо, что сам скрипт сначала режется на кусочки (по гораздо более заумным правилам, нежели просто по пробелам), а потом эти кусочки разным образом интерпретируются? Да и любой текстовый файл, к сожалению, это длинная-длинная строка, которая режется на кусочки, а каждый кусочек интерпретируется уже как отдельная строка. Ужас-ужас :)
прочитайте полностью сообщение от 2-го июня, на которое Вы ответили: Ваш вариант медленнее.
я знаю.
это проблема BASH'а. Просто он с любыми данными работает как со строками. Потому кривой путь получается быстрее прямого. Если-бы в BASH'е были-бы целые числа, мой вариант работал-бы быстрее... ZyX да, я с вами согласен.
drBatty, прочитайте полностью сообщение от 2-го июня, на которое Вы ответили: Ваш вариант медленнее.
Прочитайте также моё сообщение: его вариант в zsh быстрее. Лучше использовать именно его: будет меньше проблем, если захотите перейти.
Не совсем понял, о каких проблемах и о каком переходе речь?
А насчёт того, что лучше... Почему в книгах по коммерческим Unix-ам уделяют столько внимания столь неудобному POSIX shell? Потому что в большинстве таких систем bash и zsh может не быть, а POSIX shell есть всегда. В точности то же самое можно сказать о bash и Linux: в любой Linux-системе bash установлен по умолчанию. Именно поэтому я не хочу переучиваться на zsh. На свою машину я могу поставить всё что угодно. Но мне элементарно удобно быть уверенным в том, что на _любой_ Linux-машине есть привычная мне оболочка.
А в данном конкретном случае есть ещё один (второстепенный) момент. На мой взгляд, вариант "for n in `seq 133`" гораздо легче и быстрее воспринимается "на глаз", чем "for ((n=1; n<=133; n++))". Запись seq 133 атомарна, а вторая запись состоит из трёх раздельных элементов, каждый из которых "читается" по отдельности. Понятно, что для опытного сишника, который уже давно набил руку на такие циклы, вторая запись тоже выглядит атомарной. Но лично мне первая нравится гораздо больше. В первом варианте заложена логика человеческая, а во втором -- компьютерная. Я не привык думать как компьютер.