Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Пара вопросов по shell скриптам  (Прочитано 2378 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Alie Alexandross

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1576
    • Просмотр профиля
Пара вопросов по shell скриптам
« : 25 Ноября 2008, 22:10:49 »
Доброго времени суток!

За время знакомства с shell (довольно-таки непродолжительное время стоит отметить) накопилось несколько вопросов по bash.
1. Возможно-ли в операторе if заклинить процесс else, чтоб тот возвращал скрипт на исходную позицию? Звучит, наверное коряво, потому добавлю пример:

echo "Type 'yes' to continue, or 'no' to abort"
read _VAR
if [ "$_VAR" = "yes" ]
   then
        echo "Processing..."
#      Commands
elif [ "$_VAR" = "no" ]
     then
          echo "Aborting process..."
else
          echo "Type 'yes' to continue, or 'no' to abort"
fi
С if и elif проблем не возникает, а вот else просто выведет строку и закроет скрипт. Приходится копировать всё условие в else ещё раз. На три попытки меня ещё хватит, но не до бесконечности-же копировать? Очень прошу подсказать альтернативу процессу, или иной выход.

2. Возможно-ли заменить имеющееся условие на более простое:
echo "Type 'y(Yes)' to continue, or 'n(No)' to abort"
read _VAR

if [ "$_VAR" = "y" -o "$_VAR" = "yes" -o "$_VAR" = "Yes" -o "$_VAR" = "YES" ]
   then
        echo "Processing..."
#      Commands
elif [ "$_VAR" = "n" -o "$_VAR" = "no" -o "$_VAR" = "No" -o "$_VAR" = "NO" ]
     then
          echo "Aborting process.."
else
          echo "Type 'y(Yes)' to continue, or 'n(No)' to abort"
fi
Для того, чтоб "научить" скрипт понимать регистр приходится описывать вручную все возможные варианты. Есть-ли опция воспринимать переменную вне зависимости от регистра?

3. Каким образом можно эмулировать действие скрипта в целях проверки работоспособности?
Пару дней назад попала в ситуёвину: ночь на дворе, а я сижу и переписываю информацию с убитого винта. Скорость передачи при этом даже до 500 kb/s не доходила! Перспектива провести всю ночь в спасениях файлов не прельщала абсолютно )), потому решила написать простенький скрипт, который сам создаст папку, сольёт нужные директории, подчистит за собой и вырубит комп.
Утром просыпаюсь - комп урчит на меня)) Оказалось в самом конце забыла кавычку закрыть. Думаю знакомая многим ситуация, особенно когда пишешь что-то в два часа ночи с одним открытым глазом  :)

Заранее спасибо!
Подпись автора jillsmitt истинна...

Оффлайн tolstyj

  • Участник
  • *
  • Сообщений: 186
    • Просмотр профиля
Re: Пара вопросов по shell скриптам
« Ответ #1 : 25 Ноября 2008, 22:27:58 »
В первом случае лучше использовать select, вместо if - else.

http://gazette.linux.ru.net/rus/articles/abs-guide/x5220.html

Оффлайн axe

  • Старожил
  • *
  • Сообщений: 1203
    • Просмотр профиля
Re: Пара вопросов по shell скриптам
« Ответ #2 : 25 Ноября 2008, 23:13:52 »
в первом случае лучше использовать цикл:
"пока ввод неправильный, продолжать спрашивать". ссылка выше - очень хорошая, кстати, там про циклы есть все, что нужно.

во втором - можно сначала перевести введенный текст в верхний, например, регистр:
read _VAR;
_VAR=$(echo $_VAR |  tr [a-z] [A-Z]);
и сравнивать только с YES и NO

Оффлайн axe

  • Старожил
  • *
  • Сообщений: 1203
    • Просмотр профиля
Re: Пара вопросов по shell скриптам
« Ответ #3 : 25 Ноября 2008, 23:21:04 »
третьей проблемы не понял: что мешает запустить скрипт, и посмотреть, правильно работает, или нет?

ЗЫ: очень приятно видеть стремление разобраться и научиться делать лучше. Даже если вопросы такие.. хм.. наивные - это проходит :)

Оффлайн Alie Alexandross

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1576
    • Просмотр профиля
Re: Пара вопросов по shell скриптам
« Ответ #4 : 26 Ноября 2008, 03:38:44 »
Прежде всего: большое спасибо как за ответы, так и за внимание!

Заменив if на select получила желаемый результат. На радостях даже повводила тарабарщину раз двадцать - любовалась как меня игнорируют ))
Проштудировав страницу, приведённую в ссылке нашла ответ и на второй вопрос. Вместо if применила case:
#!/bin/bash
echo "Type 'y(Yes)' to continue, or 'n(No)' to abort"
read _VAR
case "$_VAR" in
      *[yY]* | *[yY][eE][sS]* )
        echo "Processing..."
      ;;

      *[nN]* | *[oO]* )
        echo "Aborting process..."
      ;;

      * )
        echo "Type 'yes' to continue, or 'no' to abort"
      ;;
esac
Писанины, по сравнению с предыдущим вариантом, заметно поубавилось. Да и shell воспринимает комбинации от простого n до экзотических yEs и nO.

Цитировать
третьей проблемы не понял: что мешает запустить скрипт, и посмотреть, правильно работает, или нет?
Я объясню на примере:
Представим на секунду, что нам нужно перекопировать несколько директорий а-ля бэкап.
#!/bin/bash
mount /dev/sdb1
mkdir /dev/sdb1/backup
if [ -d "/mnt/sdb1" ]
   then
         cp -r /home/media /mnt/sdb1/backup         #Вес папки 50 Gb
         cp -r /home/ISO /mnt/sdb1/backup            #Вес папки 100 Gb
   else
        echo "Error"
fi
umount dev/sdb1                                              #Пропущен знак /. Теперь размонтирование невозможно
shutdown -P now
Ошибка допущена уже после копирования файлов. Таким образом, чтоб на неё наткнутся нужно дождатся завершения всех предыдущих процессов. А для копирования 150Гб потребуется немало времени. Вот если существует возможность запустить проверку скрипта без действий с его стороны - симитировать процесс...

P.S. В shell я организм пока не сформировавшийся, так что как только начинаю писать чушь - сразу одёргивайте ;)
Подпись автора jillsmitt истинна...

Оффлайн Alsvartr

  • Активист
  • *
  • Сообщений: 779
  • The secret of the secret
    • Просмотр профиля
Re: Пара вопросов по shell скриптам
« Ответ #5 : 26 Ноября 2008, 06:04:08 »
Про имитацию запуска - насколько я знаю, dry run в баше прогнать нельзя. Лучше всего просто встраивать проверки прямо в код при ресурсоемких операциях - в любом случае, это хорошая практика и настраивает на написание хорошего кода:
#!/bin/bash
dev="/dev/sdb1"
point="/mnt/sdb1"

if ([ -e $dev ] && [ -d $point ])
   then
         mount $dev $point
         mkdir $point/backup
         cp -r /home/media $point/backup
         cp -r /home/ISO $point/backup
         umount $dev
         shutdown -P now
   else
        echo "Error"
fi

Оффлайн tolstyj

  • Участник
  • *
  • Сообщений: 186
    • Просмотр профиля
Re: Пара вопросов по shell скриптам
« Ответ #6 : 27 Ноября 2008, 07:33:55 »

Ошибка допущена уже после копирования файлов. Таким образом, чтоб на неё наткнутся нужно дождатся завершения всех предыдущих процессов. А для копирования 150Гб потребуется немало времени. Вот если существует возможность запустить проверку скрипта без действий с его стороны - симитировать процесс...

P.S. В shell я организм пока не сформировавшийся, так что как только начинаю писать чушь - сразу одёргивайте ;)

Я обычно делаю так, комментирую основную операцию и вместо нее вставляю, например,
echo "Copy files"
Тогда ты увидишь, что скрипт дошел до нужной стадии и пошел дальше.

Оффлайн Alie Alexandross

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1576
    • Просмотр профиля
Re: Пара вопросов по shell скриптам
« Ответ #7 : 30 Ноября 2008, 14:59:56 »
Цитировать
...обычно делаю так, комментирую основную операцию и вместо нее вставляю, например
На практике очень редко получается применить эту технику, так как операнды ориентированы на файлы и папки, которые создаются на ходу.

В качестве примера привожу способ подготовки дискового раздела для последющего переноса в него data:
_DEFPART = "/dev/sdb1"
if [ -e "$_DEFPART" ]
   then
        echo "HDD found"
       _BACKUPDIR = "/mnt/Local-disk_C"
       mount /dev/sdb1 $_BACKUPDIR

       if [ -d "$_BACKUPDIR/backup" ]
          then
               cp $HOME/.marker $BACKUPDIR/backup

               if [ -f $BACKUPDIR/backup/.marker" ]
                  then
                       echo "We're ready for transfer, doc!"
##                   Proccess goes here
                  else
                       echo "Folder is write-protected"
              fi

          else
              echo "0_o"
              exit
        fi   

       else
           echo "Check the slave"
           echo "Type r(Run) to choose another partition, or e(Exit) to close the script"
           READ _RUN
      
          case $_RUN in
               *[rR]* | *[rR][uU][nN]* )
                         cat /proc/partitions | cut -b23-
                         echo "Type the name of desired partition"
                         READ _NEWPART

                         if [ -e "$_NEWPART" ]
                            then
                                 echo "HDD found"
                                _BACKUPDIR = "/mnt/Local-disk_C"
                                mount /dev/sdb1 $_BACKUPDIR
                                mkdir $_BACKUPDIR/backup
                                if [ -d "$_BACKUPDIR/backup" ]
                                   then
                                   cp $HOME/.marker $BACKUPDIR/backup
                                   if [ -f $BACKUPDIR/backup/.marker" ]
                                      then
                                           echo "We're ready for transfer, doc!"
##                                       Proccess goes here
                                       else
                                   echo "Folder is write-protected"
                                 fi
                           else
                               echo "0_o"
                               exit
                           fi   
                          else
                              echo "Check the slave"
                       fi
            ;;

           *[eE]* | *[eE][xX][iI][tT]* )
           exit
           ;;

           * )
           echo "Type r(Run) to choose another partition, or e(Exit) to close the script"
           ;;
      esac
fi
Тут одних условий больше чем действий. Даже если коментировать действия и заменять их на echo выводы - получится проверить только else часть кода ((
Если я правильно поняла Alsvartr-а, то приведённый пример как раз именно в стиле его рекомендаций. Поправьте меня, если ошибаюсь.
Спасибо за советы и идеи! Стараюсь пользоватся всеми методами.
« Последнее редактирование: 30 Ноября 2008, 15:03:14 от Alie Alexandross »
Подпись автора jillsmitt истинна...

Оффлайн reegrothgloback

  • Любитель
  • *
  • Сообщений: 89
    • Просмотр профиля
Re: Пара вопросов по shell скриптам
« Ответ #8 : 30 Ноября 2008, 15:28:15 »
Alie Alexandross у тебя так всё захватывающе интересно! Погрузи меня в свой мир.

 

Страница сгенерирована за 0.033 секунд. Запросов: 25.