The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
задание имён масовов в цыкле, !*! 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

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




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру