LINUX.ORG.RU

скрипт с getopt


0

0

Можете объяснить, как написать скрипт?

Само задание: Необходимо написать сценарий test_panel, вызываемый с по крайней мере одним параметром panel_program, обеспечивающую возможность: для каждого файла с расширением in в подкаталоге tests текущего каталога запустить программу заданную параметром panel_program (решающую задачу 5 по информатике) результат каждого запуска проанализировать и сформировать отчет, из которого для каждого теста должно быть ясно провален тест или прошел успешно: код возврата сравнить с значением из соответствующего файла с расширением .status вывод сравнить с содержимым файла .out Программа должна распознавать опцию -r (--report-type), позволяющая выбрать вид форматирования отчета. Необходимо предусмотреть как минимум два вида отчета (например, краткий и подробный).

То, что знаю:

#if [ $# == 0 ]

#then

# echo 'Введите параметры'

#exit 1

#fi

#сам getopt. Правда, не знаю пока, что он должен выводить, поэтому просто 1 и 2

set — `getopt r:a «$@»`

#[ $# -lt 1 ] && exit 1 # getopt failed

while [ $# -gt 0 ]

do

case «$1» in

-r) echo «1»;break;;

-report-type) echo «1»; break;;

--) echo «2»; break;;

esac

shift

done

# поиск файла с расширением in

for i in `find $i -name «*.in» -print 2> /dev/null`

do

# а тут я только понимаю смысл, что файл in нужно отправить на программу, её выход сравнить с содержимым .out ...

done

В общем, знаю я немного)


В bash есть встроенный getopts http://www.bash-hackers.org/wiki/doku.php/howto/getopts_tutorial но можете использовать getopt, а можете, ИМХО, разбирать строку опций просто в цикле, если у вас всего один не обязательный параметр.

сам getopt. Правда, не знаю пока, что он должен выводить

Ну дак просто в командной строке позапускайте «getopt 'r:a' ВСякие разные опции»

Правда, я не понял, какой смысл в этой конструкции «set — `getopt r:a »$@«`»

for i in `find $i -name «*.in» -print 2> /dev/null`

В подкаталоге tests. ИМХО, find здесь лишний, или уж тогда

#!/bin/bash
for infile in tests/*.in ; do
   tname=${infile#tests/}; tname=${tname%.in}
   if [ -f $infile -a -f tests/${tname}.out ] ; then
      $panel_program < $infile > tmp.file
      tstaus=$?
      cmp tmp.file tests/${tname}.out
   fi
done
mky ★★★★★ ()
Ответ на: комментарий от mky

Правда, я не понял, какой смысл в этой конструкции «set — `getopt r:a »$@«`»

типа «нормализации» аргументов.

эту конструкцию лучше делать

ARGS=`getopt -o blah:blah -- "$@" `
eval set -- "$ARGS"

подробности можно глянуть в man bash на set — и в /usr/share/misc/getopt/getopt-parse.bash

ananas ★★★★★ ()
Ответ на: комментарий от ananas

Я не против использования getopt, хотя, ИМХО в случае такой простой программы он оправдан только для лабы. Я проив его вызова без проверки результата его выполнения ($?).

2Holly Изучите getopt-parse.bash, если файла нет на вашем компьютере, возмите здесь http://software.frodo.looijaard.name/getopt/docs/getopt-parse.bash

mky ★★★★★ ()
Ответ на: комментарий от mky

> Я проив его вызова без проверки результата его выполнения ($?).

это понятно. любые более-менее критические операции стоит проверять. и использование промежуточной переменной в данном случае как раз и нужно, чтобы при необходимости воткнуть проверку

ananas ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.