Столкнлся с интерестной особенность назначения имён массивам в цыкле.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, так что не самый красивый способ..
Может кто подскажит, как можно првильно задать имя массиву в цыкле?
вот ведь как народ мучается когда не знает perl
+1
Чем учить особенности шеллов, awk, grep, sed лучше один раз выучить perl, тем более что на уровне достаточном для сисадмина на это уйдет от силы пару дней.
>+1
>Чем учить особенности шеллов, awk, grep, sed лучше один раз выучить perl,
>тем более что на уровне достаточном для сисадмина на это уйдет
>от силы пару дней.у того кто вмеру натрахался с шелами на это уйдет пол дня )
ЗЫ
лучшие шеловоды России рекомендуют!
>>+1
>>Чем учить особенности шеллов, awk, grep, sed лучше один раз выучить perl,
>>тем более что на уровне достаточном для сисадмина на это уйдет
>>от силы пару дней.
>
>у того кто вмеру натрахался с шелами на это уйдет пол дня
>)
>ЗЫ
>лучшие шеловоды России рекомендуют!Очень дельный совет... Может после это скрипта и засяду за перл, но пока хочу дописать этот как есть на шеле!
И я так пнимаю ни у кого по делу совета нету?
>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>Может кто подскажит, как можно првильно задать имя массиву в цыкле?
Тут нам с тобой уже подсказали, что _всё_ это неправильно... %)
>>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Не подскажешь как в такой конструкции правильно указать имя масива в цыкле?
>Спасиба большое, ты мне очень помог! Сам бы я никогда не додумался использовать 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
>donefor((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
Перловоды просто не понимают зачем вообще так извращаться. Кстати в перле eval тоже присутствует(хотя вместо хешей используется только извращенцами и обфускаторами) так что любители перловки догадываются про возможность его применения наравне со всякими перлоненавистниками.
А вообще "сделать все на чистом шелле" это типа задачек на олимпиадах - неплохая гимнастика для ума, но в 99% ненужно на практике :)
>Перловоды просто не понимают зачем вообще так извращаться.Умищем окружающих -- пуга-а-ать. :)))
>любители перловки догадываются про возможность его применения наравне со всякими перлоненавистниками.
Скучный он какой-то? То ли дело "примитивный" шел: есть возможность сделать то, чего никто бы и не подумал... :) ..."место подвигу!" %)
>это типа задачек на олимпиадах - неплохая гимнастика для ума
>, но в 99% ненужно на практике :)Ну, довести использование/знание инструмента до предела, понять и узнать эти пределы, а потом эти ограничения преодолеть... Проце-е-ес! :)
Вспоминается, например, sed-индентер http:/openforum/vsluhforumID9/7801.html . Оказывается можно и на sed-е, хотя в итоге совершенно (почти) нечитаемо и медленнее, чем на пер^W(упс)awk-е.
Задачка "chmod -x chmod" -- тоже там где-то. Установить ограничения -- применить инструмент, не имеющий оных. http:/openforum/vsluhforumID1/83651.html
И кстати, довести инструмент до предела, установить ограничения -- вернуться к выбору [подходящего] инструмента, повторить... Процес...
~~ "Жажда ничто, имидж всё." + "Главное не результат, а процесс." + "Пирятно поговорить с умным человеком -- потому и не замолкаю." и пр.
>любители перловки догадываются про возможность его применения наравне со всякими перлоненавистниками.Бывает исполнение обычных строк кода приводит к аварийному завершению, если что-то идет не так: возникает деление на ноль, ошибочное применение шаблона, недостаточно прав для операций с файлом, ошибка внутри подпрограммы и пр.
eval решает эту проблему. Если внутри блока eval произойдет ошибка, управление будет передано строке, следующей сразу же за блоком eval.
Первоисточники: документация, Randal L.Schwartz "Intermediate Perl".
Простите, вы кого тут решили просветить?
>Кстати, особые ненавистники перла ещё и 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Спасибо большое за помощь!
Остаюсь сторонником шела!:)