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


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Не могу понять алгоритм (очередной BASH скрипт)  (Прочитано 1109 раз)

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

Оффлайн BAKT

  • Автор темы
  • Участник
  • *
  • Сообщений: 112
    • Просмотр профиля
День добрый.

Учу потихоньку баш, и возникло желание создать для работы небольшой универсальный скрипт по  установке\копированию одного приложения на компах пользователей.
В идеале скрипт запускается с одним или двумя параметрами в виде username реального пользователя и в зависимости от количества параметров выполняется та или иная часть скрипта.

Что я хочу от скрипта:

0. При запуске без параметров - выдавать ошибку, что не указан username
1. При запуске с 1-м параметром - проверять существует ли такой юзер и если всё нормально, то ему ставится программа.
2. При запуске с 2-мя параметрами - проверяется наличие обоих пользователей, если хоть одного нет, то скрипт выходит с ошибкой, если оба есть, то от пользователя1 к пользователю2 эта программа копируется.

Получилось пока набросать вот такой вот скрипт.

#!/bin/bash

if [ $# -eq "0" ]; then
  echo "Не указано имя пользователя...."
else
  if [ ! $# -gt "1" ]; then
    grep $1 /etc/passwd > /dev/null 2>&1
      if [ ! $? -eq "0" ]; then
        echo "Пользователь  $1 не существует"
      else
        echo "app будет установлен для пользователя $1"
      fi
  else                                                                         
                                                                               
    for i in $1 $2; do                                                         
      grep $i /etc/passwd > /dev/null 2>&1                                     
        if [ $? -ne "0" ]; then                                                 
          echo "Пользователя $i не существует"                                 
          exit 1                                                               
        fi
    done

    if [ $? -eq "0" ]; then
      echo "Копируем app $1 -> $2"
    else
      echo "Выход с ошибкой"
    fi
  fi
fi
echo "Выход"

Для проверки запускаю его по очереди с правильными и НЕ правильными параметрами (для удобства просто из второго скрипта).

echo -e "\nNo username"
./t1.sh

echo -e "\nUser 1"

./t1.sh teacher

echo -e "\nWrong user 1"

./t1.sh wronguser1

echo -e "\nuser 1 -> 2"

./t1.sh teacher crew

echo -e "\nWrong user 1 -> 2"

./t1.sh teacher wronguser2

./t1.sh wronguser1 crew


Вот вывод от второго скрипта:

./t2.sh

No username
Не указано имя пользователя....
Выход

User 1
app будет установлен для пользователя teacher
Выход

Wrong user 1
Пользователь  wronguser1 не существует
Выход

user 1 -> 2
Копируем app teacher -> crew
Выход

Wrong user 1 -> 2
Пользователя wronguser2 не существует
Пользователя wronguser1 не существует

Собственно вопрос такой - почему после последней ошибки\проверки я не вижу ни сообщения "выход", ни "выход с ошибкой"? Где я ошибся?

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
Re: Не могу понять алгоритм (очередной BASH скрипт)
« Ответ #1 : 04 Сентября 2016, 18:39:46 »
Цитировать
от пользователя1 к пользователю2 эта программа копируется.
Это как? проги вобще-то ставятся от рута т.е для всех юзеров.

Цитировать
почему после последней ошибки\проверки я не вижу ни сообщения "выход"
Цитировать
          echo "Пользователя $i не существует"                                 
          exit 1     
 

Оффлайн BAKT

  • Автор темы
  • Участник
  • *
  • Сообщений: 112
    • Просмотр профиля
Re: Не могу понять алгоритм (очередной BASH скрипт)
« Ответ #2 : 04 Сентября 2016, 19:10:55 »
Цитировать
от пользователя1 к пользователю2 эта программа копируется.
Это как? проги вобще-то ставятся от рута т.е для всех юзеров.

Я не совсем корректно выразился. Не саму прогу, а её "рабочую папку" в хомяке пользователя (сори, я нуб и не знаю как это правильно называется ), а-ля ~/.wine или ~/.PlayOnLinux, которые создаются индивидуально для каждого пользователя.


Ну в общем я так и думал. Однако, если я убираю "exit 1", то на выходе я тогда имею ошибку:

Wrong user 1 -> 2
Пользователя wronguser2 не существует
Копируем app teacher -> wronguser2
Выход

Пользователя wronguser1 не существует
Копируем app wronguser1 -> crew
Выход

Даже после проверки на существование пользователя скрипт пытается "отработать" этого пользователя.
Правильно ли я понимаю, что "exit 1" выполняет полный выход из скрипта? И тогда получается, что я зря беспокоюсь и мой скрипт нормально отрабатывает?

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
Re: Не могу понять алгоритм (очередной BASH скрипт)
« Ответ #3 : 04 Сентября 2016, 20:11:55 »
Цитировать
Правильно ли я понимаю, что "exit 1" выполняет полный выход из скрипта?
да.

Вот скрипт попробуй:
#!/bin/bash

[ $# = 0 ] && { echo "Не указаны параметры."; exit; }

USR_CNT=0

while getopts u:a: P
do
    case "$P" in
        u) USR_STR="$(grep "^${OPTARG}:" /etc/passwd)"
           [ "$USR_STR" ] || { echo "Пользователь $OPTARG не существует"; exit; }
           USR_HOME="$(grep -Po ':\K/home/[^:]+(?=:)' <<<"$USR_STR")"
           [ -d "$USR_HOME" ] || { echo "Домашняя директория пользователя $OPTARG не найдена."; exit; }
           ((USR_CNT+=1))
           if [ $USR_CNT = 1 ]; then
               USR1="$OPTARG"
               USR1_HOME="$USR_HOME"
           else
               USR2="$OPTARG"
               USR2_HOME="$USR_HOME"
           fi
           ;;
        a) APP="$OPTARG" ;;
    esac
done

[ "$APP" ] || { echo "Не указана директория APP."; exit; }

if [ $USR_CNT = 0 ]; then
echo "Не указано имя пользователя."
exit

elif [ $USR_CNT = 1 ]; then
[ -d "$HOME/$APP" ] || { echo "Директория APP: \"$APP\" не найдена."; exit; }
echo "$APP установлен для пользователя $USR1"
rm -r -f "$USR1_HOME/${APP##*/}"
cp -r "$HOME/$APP" "$USR1_HOME"

elif [ $USR_CNT = 2 ]; then
[ -d "$USR1_HOME/$APP" ] || { echo "Директория APP: \"$APP\" не найдена."; exit; }
echo "Копируем $APP $USR1 -> $USR2"
rm -r -f "$USR2_HOME/${APP##*/}"
cp -r "$USR1_HOME/$APP" "$USR2_HOME"
else
echo "Указано более двух пользователей."
exit
fi

Параметры:
-u user_name -a app_dir
или
-u user_name -u user_name2 -a app_dir
« Последнее редактирование: 04 Сентября 2016, 21:55:36 от renzrv »

Оффлайн BAKT

  • Автор темы
  • Участник
  • *
  • Сообщений: 112
    • Просмотр профиля
Re: Не могу понять алгоритм (очередной BASH скрипт)
« Ответ #4 : 04 Сентября 2016, 22:03:19 »
Спасибо, сейчас попробую. Только можно попросить небольшой комментарий что это всё значит? :)
Ибо в этом куске я понял только отдельные моменты :(

while getopts u:a: P
do
    case "$P" in
        u) USR_STR="$(grep "^${OPTARG}:" /etc/passwd)"
           [ "$USR_STR" ] || { echo "Пользователь $OPTARG не существует"; exit; }
           USR_HOME="$(grep -Po ':\K/home/[^:]+(?=:)' <<<"$USR_STR")"
           [ -d "$USR_HOME" ] || { echo "Домашняя директория пользователя $OPTARG не найдена."; exit; }
           ((USR_CNT+=1))
           if [ $USR_CNT = 1 ]; then
               USR1="$OPTARG"
               USR1_HOME="$USR_HOME"
           else
               USR2="$OPTARG"
               USR2_HOME="$USR_HOME"
           fi
           ;;
        a) APP="$OPTARG" ;;
    esac
done

Или где про это можно почитать?

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
Re: Не могу понять алгоритм (очередной BASH скрипт)
« Ответ #5 : 04 Сентября 2016, 22:09:46 »
Цитировать
Или где про это можно почитать?
Я же давал ссылку: http://www.opennet.ru/docs/RUS/bash_scripting_guide/
про getops: http://www.opennet.ru/docs/RUS/bash_scripting_guide/c5358.html#EX33

Пользователь добавил сообщение 04 Сентября 2016, 23:23:05:
Без опций, немного упростил:
#!/bin/bash

Usr_chk_n_home() {
USR_STR="$(grep "^${1}:" /etc/passwd)"
[ "$USR_STR" ] || { echo "Пользователь $1 не существует"; exit; }
USR_HOME="$(grep -Po ':\K/home/[^:]+(?=:)' <<<"$USR_STR")"
[ -d "$USR_HOME" ] || { echo "Домашняя директория пользователя $1 не найдена."; exit; }
}

case $# in
0) echo "Не указаны параметры."; exit ;;
2) echo "Копирование $2 пользователю $1 ..."
Usr_chk_n_home $1
[ -d "$HOME/$2" ] || { echo "Директория APP: \"$2\" не найдена."; exit; }
rm -r -f "$USR_HOME/$2"
cp -r "$HOME/$2" "$USR_HOME"
;;
3) echo "Копирование $3 от пользователя $1 пользователю $2 ..."
Usr_chk_n_home "$1"
USR1_HOME="$USR_HOME"
Usr_chk_n_home "$2"
USR2_HOME="$USR_HOME"
[ -d "$USR1_HOME/$3" ] || { echo "Директория APP: \"$3\" не найдена."; exit; }
rm -r -f "$USR2_HOME/$3"
cp -r "$USR1_HOME/$3" "$USR2_HOME"
;;
*) echo "Неверное количество параметров."; exit ;;
esac
echo OK


Параметры:
user_name app_dir
или
user_name user_name2 app_dir

if-elif'ы заменил одним case
« Последнее редактирование: 05 Сентября 2016, 09:56:32 от renzrv »

Оффлайн BAKT

  • Автор темы
  • Участник
  • *
  • Сообщений: 112
    • Просмотр профиля
Re: Не могу понять алгоритм (очередной BASH скрипт)
« Ответ #6 : 08 Сентября 2016, 02:29:54 »
Так понятнее. Спасибо.

 

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