LINUX.ORG.RU
ФорумAdmin

проблема с считыванием переменной

 , , , ,


0

1

Добрый день. При реализации скрипта столкнулся с проблемой, нужно реализовать функцию которая будет в зависимости от входящих параметров выполнять определенные действия. Если на вход скрипта поступает параметр -p or –proc то на экран должно отобразиться содержимое директории /proc, а если есть второй параметр например cpuinfo, то при выполнении скрипта ./script.sh -p cpuinfo выведит на экран содержимое файла. Текст фнукции

proc () {
  if [ "$1" = "-p" ]
   then
         ls /proc
    elif [ "$2" != " " ]
    then
           cat /proc/"$2"
    else
          exit
fi
}

В таком ввиде когда запускаю скрипт

./script.sh -p

не отрабатывает команда ls которая выдать листининг директории /proc и выдает ошибку «cat /proc это каталог», а если запустить скрипт с двумя переменными

./script.sh -p cpuinfo

после выполнения выводиться содержимое файла /proc/cpuinfo.

Данная функция после запуска должна отрабатывать в двух видах

./script.sh -p и ./script.sh --proc,а также с двумя параметрами
./script.sh -p($1) $2(любой файл в директории /proc) и ./script.sh --proc($1) $2

Можете сказать где мог допустить ошибку и как добавить реализацию для –proc

По сути нужно написать скрипт который будет выполнять мониторинг ресурсов сервера, в скрипте должны быть функции: помощь (выводит список опций скрипта); работа с директорией работа с процессором работа с памятью и т.д. Каждая функция должна выполняться с «-» и «–» например:

./scpript.sh -h or ./script.sh --help
./script.sh -p or ./script.sh --proc
и т.д.

Подскажите как лучше сделать в каждой функции сделать цикл

while getopts ":h:p:m" arg; do
case $arg in
-h ) command
-m) command
esac
done

Или же в каждой функции сделать проверку на ввод параметров, а уже в главной функции(main) сделать цикл while который будет проверять в каком в виде введен первый параметр с («-» или «–») и выполнял соответствующие функции.

while getopts ":h:p:m" arg; do
case $arg in
-h ) command
--help) command
-m) command
--memory) command
и т.д.
esac
done

Перемещено hobbit из general



Последнее исправление: NARUTO (всего исправлений: 4)

Ответ на: комментарий от YAR

Функция proc одна из нескольких из которых будет состоять конечный скрипт. Как понимаю getopt позволяет передать параметр в виде -p или –proc. Мне нужно сделать так чтобы при выполнении скрипта можно было передать первый параметр либо с «-» или «–» и при этом скрипт должен отрабатывать в обоих случаях. Скажите может лучше в каждой функции добавить условие «if [ getopt = «:$1»]» или же задать цикл

while getopts ":$1" options; do 
case $options in
-$1) command;;
--$1) command ;;
esac
done
NARUTO
() автор топика
Ответ на: комментарий от Irma

Если без аргументов скрипт не отработает, а если будет передан первый параметр -p or –proc то должна отработать команда которая отобразит содержимое директории /proc, и если будет передано два параметра например

./script.sh -p meminfo 
or
./script.sh --proc cmdline

будет отображено содержимое файла который передан как второй параметр

NARUTO
() автор топика
Ответ на: комментарий от NARUTO

Как поступить, знаешь только ты. Может Irma и прав, но вот завтра, например, тебе захочется добавить еще параметр «–sys»…

без аргументов скрипт не отработает…

…и как, что, куда гадать?

Может лучше придерживаться «правил хорошего тона». При запуске без аргументов пусть выводит «usage». При запуске с параметром «-v» пусть показывает версию, и т.д. А разбор входных параметров понадобится в любом скрипте, так может сразу подумать об универсальности…

andytux ★★★★★
()

нужно написать скрипт…

…а перед этим почитать.

в главной функции(main)…

Например, прозаично-одинаковый конец почти во всех скриптах:

## BEGIN main ##
## BEGIN config ##
arg_parse "$@"
config "$@"
## END config ##

case ${version} in
  *dbg)	messagex "254" "$@";;
  253*)	${ex};;
  *)	${ex} "$@";;
esac
## END main ##

цикл while который будет проверять в каком в виде введен первый параметр…

Не while, но цикл… В начале скрипта функция arg_parse, которая занимается разбором параметров:

arg_parse()
{	# arg_parse	21.04
  [ "$#" = '0' ] && usage && exit 0
  [ "$#" = '1' ] && case ${1} in
		  --version|-v)	echo "$(basename "$0") ${version}"; exit 0;;
		  *)	;;
		esac
  for i; do
	case ${i} in
	  --arch=*)	arch="${i#--arch=} ${arch}";;
	  -l=*)		lng=${i#-l=};;
	  --lng=*)	lng=${i#--lng=};;
	  --src=*)	src=${i#--src=};;
	  -u=*)		util=${i#-u=};;
	  --util=*)	util=${i#--util=};;
	  -v=*)		version=${i#-v=};;
	  --version=*)	version=${i#--version=};;
	  --)		;;
	  *)	if [ -n "${opt}" ]; then opt="${opt} ${i}"; else opt="${i}"; fi;;
	esac
  done
}
andytux ★★★★★
()
Ответ на: комментарий от andytux

Можете объяснить данную часть:

case ${i} in
	  --arch=*)	arch="${i#--arch=} ${arch}";;
	  -l=*)		lng=${i#-l=};;
	  --lng=*)	lng=${i#--lng=};;
	  --src=*)	src=${i#--src=};;
	  -u=*)		util=${i#-u=};;
	  --util=*)	util=${i#--util=};;
	  -v=*)		version=${i#-v=};;
	  --version=*)	version=${i#--version=};;
	  --)		;;
	  *)	if [ -n "${opt}" ]; then opt="${opt} ${i}"; else opt="${i}"; fi;;
	esac

Полуается что в данной строке

-l=*)		lng=${i#-l=}

lng - это функция которая объявляется в скрипте, а после вызыватеся в цикле ‘for’ через ‘case’ тогда что означает ‘${i#-l=}’?;

‘-l=*’ - в этой части получается ‘-l’ это параметр который будет передан на вход скрипту. например:

./script.sh -l # и после будет отработает функция 'lng' с заданными в ней условиями

может ли быть что в части ‘-l=*’ (=* это объявление что после параметра ‘-l’ будет передан второй параметр);

также можете объяснить проверку на какое условие выполняет данная строка:

if [ -n "${opt}" ]; then opt="${opt} ${i}"; else opt="${i}"; fi
NARUTO
() автор топика
Ответ на: комментарий от Irma

Может тогда нужно сделать так:

#!/bin/bash

arg1=$1
arg2=$2

и тогда уже в функции использовать переменые ‘arg’

напрмиер

proc () {
if [ -n "$arg1" ]
then
      if [ -z "$arg2" ]
      then
            ls /proc
      else
            cat /proc/"$arg2"
       fi
fi
NARUTO
() автор топика
Ответ на: комментарий от NARUTO

Например, скрипт запускается с параметрами:

script --lng=ru -a --

В скрипте функция arg_parse разбирает эти параметры.

for i; do
	case ${i} in

Цикл считывает позиционные параметры в переменную «i», оператор case выбирает действие для данного параметра.

	  -l=*)		lng=${i#-l=};;
	  --lng=*)	lng=${i#--lng=};;

Если в переменной цикла «i» параметр «–lng=ru», то от него отрезается «–lng=», а оставшееся «ru», присваивается переменной «lng». Далее в скрипте, вместо позиционного параметра используется эта переменная. Это позволяет передавать параметры скрипту в любом порядке. Краткая форма «-l=*» присваивает значение той-же переменной..

*)	if [ -n "${opt}" ]; then opt="${opt} ${i}"; else opt="${i}"; fi;;

Параметры, для которых нет конкретного действия будут записаны в переменную «opt». Для «-a» нет действия. Если переменная «opt» пустая, то сработает ‘else opt=«${i}»’. Если в «opt» уже что-то есть, то сработает ‘then opt=«${opt} ${i}»’. Запись будет добавлена к уже присутствующим в переменной «opt».

andytux ★★★★★
()