Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Операционные системы > Linux (Ubuntu, Debian, Red Hat, CentOS, Mint)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.07.2017, 15:19   #1
alex-u
 
Регистрация: 05.07.2017
Сообщений: 7
По умолчанию Bash - оператор выбора case и действие по умолчанию

Задача стоит вот такая:

Создать скрипт (основываясь на функциях), который бы смог подставлять нужные значения в конфигурационный файл.
Значения запрашиваются у пользователя и если пользователь, не ответил в отведенное время, ставиться значение по умолчанию.

Вот как рабочий вариант (недоработанный) - 1-части задачи

Код:
#!/usr/bin/env bash

#     

function pause(){
   echo
   #read -p "$*"
   #m="     3   ..."
   m="    ..."
   # read -n 1 -t 3 -p "$m"
   read -n 1 -p "$m"
   echo
}

file=./smb2.conf

function enter_value (){
 TIMELIMIT=4 
 local etalon=${1}
 echo -e -n "   : ${etalon} "
 read word
 
 # ${etalon} -       
 #  
 # word -  ,    
}

#enter_value "\tworkgroup = "

#      
#       
#      
#        
#      

function sed_change_option (){

local regex=$1
local option=$2
enter_value "${etalon}"

#         ,   
#  

# sed -n  -r "/^${regex}.*$/s:${option}.*$:${option}${word}:p" $file
# -n  -    
#  -r -        
#  p -         
#    
#          
#   -i ,   -n    p

sed -i -r "/^${regex}.*$/s:${option}.*$:${option}${word}:" $file

# sed -n -r '/${regex}/c \${option}' ${file} -  ,   
#       

#         
#     , 
#      
# sed '// '

#sed -n -r '/^\tworkgroup = /c \\tworkgroup = server_ssh ' 
#sed -n -r "s:^${regex}:${regex}${word}:" ${file}
# s:::

}

# enter_value "workgroup = "
#     

sed_change_option "\tworkgroup = " "workgroup = " 
# $1 - 1-      
# $2 - 2- ,    

echo
echo "    - enter_value - : "
echo "${word}"
echo

Происходит поиск опций по шаблону и когда нужны шаблон найден,
в силу вступает функция по запросу от пользователя - введения значения нужной опции.

Здесь нужно встроить оператор выбора, если значение отсутствует, то есть по истечении времени подставляется значение по умолчанию.

Вот 2-я часть скрипта, рабочий вариант функции по принятию значения от пользователя

Код:
#!/usr/bin/env bash

# данная функция позволяет установить задержку на ввод значения 
# проверяет введено ли значение 

function enter_value (){
 TIMELIMIT=10 
 local etalon=${1}
 echo -e -n "Введите нужное значение : ${etalon} "
 read -t $TIMELIMIT word 
 
 # ${etalon} - эта переменная лишь для визуального отображения 
 # изменяемой опции
 # word - глобальная переменная, в которую записывается 
 
 #-z
 #   строка "пустая", т.е. имеет нулевую длину
if [[ -z "${word}"  ]]
 then
 echo
  echo "Вы не ввели никакого значения"
  echo
 else
   echo
   echo -e "Вы ввели :  __ ${word}   __"
   echo
  fi
 }
 
 enter_value
 # вызов функции

А вот отдельно пробный вариант использования оператора case
и попытка использовать команду по умолчанию, в случае отказа пользователя от ввода команды.

В данном варианте нет таймера, не отрабатывается даже действие по умолчанию ???
Код:
read person
case "$person" in
# Обратите внимание: переменная взята в кавычки.
  "$person")
  echo
  echo "Строка не является пустой, в нее введено значение"
  echo " ---- $person ----"
  ;;
        * )
   echo
   echo "Нет данных."
   word="server"
  ;;
esac
echo
echo "---- "${word}" ----- "
Необходимо чтобы подключалось действие по умолчанию, и желательно с использованием таймера.
Еще хотелось бы понять, почему даже в простом случае не происходит
выполнение действия по умолчанию.
alex-u вне форума Ответить с цитированием
Старый 05.07.2017, 17:07   #2
alex-u
 
Регистрация: 05.07.2017
Сообщений: 7
По умолчанию

Вот что придумал, но может быть есть элегантное решение

Код:
#!/usr/bin/env bash

# пример возврата значений из функции

function pause(){
   echo
   #read -p "$*"
   #m="Нажмите любую клавишу или подождите 3 секунды для продолжения..."
   m="Нажмите любую клавишу для продолжения..."
   # read -n 1 -t 3 -p "$m"
   read -n 1 -p "$m"
   echo
}

file=./smb2.conf

function enter_value (){
 TIMELIMIT=15 
 local etalon=${1}
 echo -e -n "Введите нужное значение : ${etalon} "
 read -t $TIMELIMIT word 
 
 # ${etalon} - эта переменная лишь для визуального отображения 
 # изменяемой опции
 # word - глобальная переменная, в которую записывается 
 
 #-z
 #   строка "пустая", т.е. имеет нулевую длину
if [[ -z "${word}"  ]]
 then
 echo
  echo "Вы не ввели никакого значения"
  word="default"
  echo
 else
   echo
   echo -e "Вы ввели :  __ ${word}   __"
   echo
  fi
 
 # ${etalon} - эта переменная лишь для визуального отображения 
 # изменяемой опции
 # word - глобальная переменная, в которую записывается 
}

#enter_value "\tworkgroup = "
# enter_value "workgroup = "
# интерактивный ввод значения изменяемой опции

# Создали функцию по интерактивному вводу значений
# внутри функции создаем глобальную переменную  
# через которую будем получать возвращаемое значение
# данная функция будет позволять вводить значение в 
# заменяемые значения определенных опций конфигурационных файлов

function sed_change_option (){

local regex=$1
local option=$2
enter_value "${etalon}"

# переменная при передаче в функцию должна быть в кавычках, если она 
# имеет пробелы

# sed -n  -r "/^${regex}.*$/s:${option}.*$:${option}${word}:p" $file
# -n  - подавляет обычный вывод команды
#  -r - этот ключ используется в случае применения регулярных выражений
#  p - данный флаг позволяет вывести на экран ту информацию 
# которая может быть изменена
# для того чтобы можно было произвести редактироание непосредчтвенно в файле
# используется ключ -i , без ключа -n  и флага p

sed -i -r "/^${regex}.*$/s:${option}.*$:${option}${word}:" $file

# sed -n -r '/${regex}/c \${option}' ${file} - не получается, так как 
# символы регулярного выражения не работают в шаблоне

# Если воспользоваться при вызове команды шаблоном в виде 
# обычного текста или регулярного выражения, 
# заменены будут все соответствующие шаблону строки
# sed '/ШАБЛОН/с ЗАМЕНА'

#sed -n -r '/^\tworkgroup = /c \\tworkgroup = server_ssh ' 
#sed -n -r "s:^${regex}:${regex}${word}:" ${file}
# s:ОБРАЗЕЦ:ЗАМЕНА:

}

function delete_duplicate_str(){

sed -i -r '/workgroup\s*=/{/^\tw.* = \bWORKGROUP\b/! d}' $file

local shablon=$1

#sed -i -r '/${shablon}\s*=/{/^\tw.* = .*/! d}' $file

}

# delete_duplicate_str "workgroup"

sed_change_option "\tworkgroup = " "workgroup = " 
# $1 - 1-й аргумент передается с символами регулярных выражений
# $2 - 2-й аргумент, только название изменяемой опции

echo
echo "Возврат значения из функции - enter_value - : "
echo "${word}"
echo
alex-u вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
оператор выбора case of желающий знать Помощь студентам 4 15.01.2012 14:09
Оператор выбора CASE Pchelka1992 Помощь студентам 1 03.06.2011 09:17
Оператор выбора или условный оператор[Перенесено из JavaSE] merhaba1992 Помощь студентам 1 20.01.2011 17:06
оператор выбора case of wlll Помощь студентам 1 09.11.2010 21:59