задание имён масовов в цыкле, nastr, 28-Окт-09, 17:51 [смотреть все]Столкнлся с интерестной особенность назначения имён массивам в цыкле.while [ "$a" -le "$colu" ] do tmp${a}=(`awk '/Check File System occupancy/,/Check inodes of file system/ {print substr($5,1,4)}' $SX* | awk '/capa/,/^$/' | sed 's/capa/morning/g' | tr '\n' ' '`) done На что плучаю: ./disk_load.sh: line 15: syntax error near unexpected token ``awk '/Check File System occupancy/,/Check inodes of file system/ {print substr($5,1,4)}' $SX* | awk '/capa/,/^$/' | sed 's/capa/morning/g' | tr '\n' ' '`' ./disk_load.sh: line 15: `tmp${a}=(`awk '/Check File System occupancy/,/Check inodes of file system/ {print substr($5,1,4)}' $SX* | awk '/capa/,/^$/' | sed 's/capa/morning/g' | tr '\n' ' '`)' Я обошел это следующим образом: tmp=`awk '/Check File System occupancy/,/Check inodes of file system/ {print substr($5,1,4)}' $SX* | awk '/capa/,/^$/' | sed 's/capa/morning/g'` case $a in 1) arr1=( `echo $tmp`) ;; 2) arr2=( `echo $tmp`) ;; 3) arr3=( `echo $tmp`) ;; 4) arr4=( `echo $tmp`) ;; 5) arr5=( `echo $tmp`) ;; ... *) echo ERROR ;; esac Но таких массивов у меня, больше 20, так что не самый красивый способ.. Может кто подскажит, как можно првильно задать имя массиву в цыкле?
|
- задание имён масовов в цыкле, Pahanivo, 18:31 , 28-Окт-09 (1)
вот ведь как народ мучается когда не знает perl
- задание имён масовов в цыкле, angra, 08:23 , 29-Окт-09 (2)
+1 Чем учить особенности шеллов, awk, grep, sed лучше один раз выучить perl, тем более что на уровне достаточном для сисадмина на это уйдет от силы пару дней.
- задание имён масовов в цыкле, Pahanivo, 09:54 , 29-Окт-09 (3)
>+1 >Чем учить особенности шеллов, awk, grep, sed лучше один раз выучить perl, >тем более что на уровне достаточном для сисадмина на это уйдет >от силы пару дней. у того кто вмеру натрахался с шелами на это уйдет пол дня ) ЗЫ лучшие шеловоды России рекомендуют!
- задание имён масовов в цыкле, nastr, 10:07 , 29-Окт-09 (4)
>>+1 >>Чем учить особенности шеллов, awk, grep, sed лучше один раз выучить perl, >>тем более что на уровне достаточном для сисадмина на это уйдет >>от силы пару дней. > >у того кто вмеру натрахался с шелами на это уйдет пол дня >) >ЗЫ >лучшие шеловоды России рекомендуют! Очень дельный совет... Может после это скрипта и засяду за перл, но пока хочу дописать этот как есть на шеле! И я так пнимаю ни у кого по делу совета нету?
- задание имён масовов в цыкле, Andrey Mitrofanov, 10:15 , 29-Окт-09 (5)
>1) arr1=( `echo $tmp`) ;; Ну, во-перрвых, =($tmp) >2) arr2=( `echo $tmp`) ;; >3) arr3=( `echo $tmp`) ;; >4) arr4=( `echo $tmp`) ;; >5) arr5=( `echo $tmp`) ;; >... >*) echo ERROR ;; >esac А во-вторых, if (( a>0 && a<N )); then eval "arr$a=($tmp)" else echo ERROR fi >Может кто подскажит, как можно првильно задать имя массиву в цыкле? Тут нам с тобой уже подсказали, что _всё_ это неправильно... %)
- задание имён масовов в цыкле, nastr, 11:18 , 29-Окт-09 (6)
>>1) arr1=( `echo $tmp`) ;; >Ну, во-перрвых, =($tmp) >А во-вторых, >if (( a>0 && a<N )); then > eval "arr$a=($tmp)" >else > echo ERROR >fi Спасиба большое, ты мне очень помог! Сам бы я никогда не додумался использовать eval.:) Есть ещё один схожый вопрос. Для дальнейшей обработки массивов я использовал схожую с предидущей конструкцию, но здесь eval не подходит..:( a=0; b=0 while [ "$a" -le "$rows" ] do while [ "$b" -le "$colu" ] do case $b in 0) echo -en "${arr0[$a]} " ;; 1) echo -en "${arr1[$a]} " ;; 2) echo -en "${arr2[$a]} " ;; 3) echo -en "${arr3[$a]} " ;; 4) echo -en "${arr4[$a]} " ;; 5) echo -en "${arr5[$a]} " ;; ... *) echo ERROR ;; esac let b=b+1 done echo b=0 let a=a+1 done Если пишу так: echo -en "${arr"{b}"[$a]} " то получаю: ./disk_load.sh: line 32: ${arr`echo $b`[$a]} : bad substitution ./disk_load.sh: line 32: ${`eval "arr$b"`[$a]} : bad substitution ./disk_load.sh: line 32: ${arr"{b}"[$a]} : bad substitution Не подскажешь как в такой конструкции правильно указать имя масива в цыкле?
- задание имён масовов в цыкле, Andrey Mitrofanov, 12:37 , 29-Окт-09 (7)
>Спасиба большое, ты мне очень помог! Сам бы я никогда не додумался использовать eval.:) Пожалуйста. :) Никто б не догадался -- только самые упёртые избегатели перла. >Есть ещё один схожый вопрос. >Для дальнейшей обработки массивов я использовал схожую с предидущей конструкцию, но здесь >eval не подходит..:( Да, ладно! ;) >[оверквотинг удален] >while [ "$b" -le "$colu" ] >do >case $b in >0) echo -en "${arr0[$a]} >let b=b+1 >done >echo >b=0 >let a=a+1 >done for((a=0;a<rows;a++)); do for((b=0;b<colu;b++)); do eval "echo -en \"\${arr$a[$b]} \"" done echo done >Не подскажешь как в такой конструкции правильно указать имя масива в цыкле? Единственно "правильного" способа нет: их много, работает - и ладно. Кстати, особые ненавистники перла ещё и http:/openforum/vsluhforumID9/8262.html#5 for-ы заменяют eval-ами. Правда, если результат чуть больше среднего -- может и "не влезть". #!/bin/bash # UNO: a=0 N=5 arr0=(one two tree forge fine) for((b=0;b<N;b++)); do eval "echo -en \"\${arr$a[$b]} \"" done echo # DOS: eval "echo \"$(eval "echo $(echo \\\$\\\{arr$a\\\[{`seq -s, 0 $((N-1))`}\\\]\\\}\\ \\\ \\\ \\\ \\\ \\\ \\\ \\\ \\\ \\\ \\\ )")\"" ...а перловоды -- просто завидуют! ;-D
- задание имён масовов в цыкле, angra, 12:53 , 29-Окт-09 (8)
Перловоды просто не понимают зачем вообще так извращаться. Кстати в перле eval тоже присутствует(хотя вместо хешей используется только извращенцами и обфускаторами) так что любители перловки догадываются про возможность его применения наравне со всякими перлоненавистниками. А вообще "сделать все на чистом шелле" это типа задачек на олимпиадах - неплохая гимнастика для ума, но в 99% ненужно на практике :)
- задание имён масовов в цыкле, Andrey Mitrofanov, 14:15 , 29-Окт-09 (10)
>Перловоды просто не понимают зачем вообще так извращаться.Умищем окружающих -- пуга-а-ать. :))) >любители перловки догадываются про возможность его применения наравне со всякими перлоненавистниками. Скучный он какой-то? То ли дело "примитивный" шел: есть возможность сделать то, чего никто бы и не подумал... :) ..."место подвигу!" %) >это типа задачек на олимпиадах - неплохая гимнастика для ума >, но в 99% ненужно на практике :) Ну, довести использование/знание инструмента до предела, понять и узнать эти пределы, а потом эти ограничения преодолеть... Проце-е-ес! :) Вспоминается, например, sed-индентер http:/openforum/vsluhforumID9/7801.html . Оказывается можно и на sed-е, хотя в итоге совершенно (почти) нечитаемо и медленнее, чем на пер^W(упс)awk-е. Задачка "chmod -x chmod" -- тоже там где-то. Установить ограничения -- применить инструмент, не имеющий оных. http:/openforum/vsluhforumID1/83651.html И кстати, довести инструмент до предела, установить ограничения -- вернуться к выбору [подходящего] инструмента, повторить... Процес... ~~ "Жажда ничто, имидж всё." + "Главное не результат, а процесс." + "Пирятно поговорить с умным человеком -- потому и не замолкаю." и пр.
- в защиту eval в perl, Иван, 16:39 , 04-Ноя-09 (11)
>любители перловки догадываются про возможность его применения наравне со всякими перлоненавистниками.Бывает исполнение обычных строк кода приводит к аварийному завершению, если что-то идет не так: возникает деление на ноль, ошибочное применение шаблона, недостаточно прав для операций с файлом, ошибка внутри подпрограммы и пр. eval решает эту проблему. Если внутри блока eval произойдет ошибка, управление будет передано строке, следующей сразу же за блоком eval. Первоисточники: документация, Randal L.Schwartz "Intermediate Perl".
- задание имён масовов в цыкле, nastr, 13:19 , 29-Окт-09 (9)
>Кстати, особые ненавистники перла ещё и http:/openforum/vsluhforumID9/8262.html#5 for-ы заменяют eval-ами. Правда, если >...а перловоды -- просто завидуют! ;-DОстановился на таком варианте: for (( a = 0; a <= rows; a++ )) do echo -en "`echo ${Filesystem[$a]} | awk '{printf("%24s",$0); print " "}'` " for (( b = 0; b <= colu; b++ )) do eval "echo -en \"\${arr$b[$a]} \"" done echo done Спасибо большое за помощь! Остаюсь сторонником шела!:)
|