URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8494
[ Назад ]

Исходное сообщение
"задание имён масовов в цыкле"

Отправлено 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 , 28-Окт-09 18:31 
вот ведь как народ мучается когда не знает perl


"задание имён масовов в цыкле"
Отправлено angra , 29-Окт-09 08:23 
+1
Чем учить особенности шеллов, awk, grep, sed лучше один раз выучить perl, тем более что на уровне достаточном для сисадмина на это уйдет от силы пару дней.

"задание имён масовов в цыкле"
Отправлено Pahanivo , 29-Окт-09 09:54 
>+1
>Чем учить особенности шеллов, awk, grep, sed лучше один раз выучить perl,
>тем более что на уровне достаточном для сисадмина на это уйдет
>от силы пару дней.

у того кто вмеру натрахался с шелами на это уйдет пол дня )
ЗЫ
лучшие шеловоды России рекомендуют!


"задание имён масовов в цыкле"
Отправлено nastr , 29-Окт-09 10:07 
>>+1
>>Чем учить особенности шеллов, awk, grep, sed лучше один раз выучить perl,
>>тем более что на уровне достаточном для сисадмина на это уйдет
>>от силы пару дней.
>
>у того кто вмеру натрахался с шелами на это уйдет пол дня
>)
>ЗЫ
>лучшие шеловоды России рекомендуют!

Очень дельный совет... Может после это скрипта и засяду за перл, но пока хочу дописать этот как есть на шеле!
И я так пнимаю ни у кого по делу совета нету?


"задание имён масовов в цыкле"
Отправлено Andrey Mitrofanov , 29-Окт-09 10:15 
>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 , 29-Окт-09 11:18 
>>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 , 29-Окт-09 12:37 
>Спасиба большое, ты мне очень помог! Сам бы я никогда не додумался использовать 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 , 29-Окт-09 12:53 
Перловоды просто не понимают зачем вообще так извращаться. Кстати в перле eval тоже присутствует(хотя вместо хешей используется только извращенцами и обфускаторами) так что любители перловки догадываются про возможность его применения наравне со всякими перлоненавистниками.
А вообще "сделать все на чистом шелле" это типа задачек на олимпиадах - неплохая гимнастика для ума, но в 99% ненужно на практике :)

"задание имён масовов в цыкле"
Отправлено Andrey Mitrofanov , 29-Окт-09 14:15 
>Перловоды просто не понимают зачем вообще так извращаться.

Умищем окружающих -- пуга-а-ать. :)))

>любители перловки догадываются про возможность его применения наравне со всякими перлоненавистниками.

Скучный он какой-то? То ли дело "примитивный" шел: есть возможность сделать то, чего никто бы и не подумал... :) ..."место подвигу!" %)

>это типа задачек на олимпиадах - неплохая гимнастика для ума
>, но в 99% ненужно на практике :)

Ну, довести использование/знание инструмента до предела, понять и узнать эти пределы, а потом эти ограничения преодолеть... Проце-е-ес! :)

Вспоминается, например, sed-индентер http:/openforum/vsluhforumID9/7801.html . Оказывается можно и на sed-е, хотя в итоге совершенно (почти) нечитаемо и медленнее, чем на пер^W(упс)awk-е.

Задачка "chmod -x chmod" -- тоже там где-то. Установить ограничения -- применить инструмент, не имеющий оных. http:/openforum/vsluhforumID1/83651.html

И кстати, довести инструмент до предела, установить ограничения -- вернуться к выбору [подходящего] инструмента, повторить... Процес...

~~ "Жажда ничто, имидж всё." + "Главное не результат, а процесс." + "Пирятно поговорить с умным человеком -- потому и не замолкаю." и пр.


"в защиту eval в perl"
Отправлено Иван , 04-Ноя-09 16:39 
>любители перловки догадываются про возможность его применения наравне со всякими перлоненавистниками.

Бывает исполнение обычных строк кода приводит к аварийному завершению, если что-то идет не так: возникает деление на ноль, ошибочное применение шаблона, недостаточно прав для операций с файлом, ошибка внутри подпрограммы и пр.
eval решает эту проблему. Если внутри блока eval произойдет ошибка, управление будет передано строке, следующей сразу же за блоком eval.
Первоисточники: документация, Randal L.Schwartz "Intermediate Perl".


"в защиту eval в perl"
Отправлено angra , 05-Ноя-09 17:18 
Простите, вы кого тут решили просветить?

"задание имён масовов в цыкле"
Отправлено nastr , 29-Окт-09 13:19 
>Кстати, особые ненавистники перла ещё и 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

Спасибо большое за помощь!
Остаюсь сторонником шела!:)