getopt|s или while

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Ответить
Аватара пользователя
lgar
Сообщения: 117
ОС: Ubuntu

getopt|s или while

Сообщение lgar »

На основе Решено: getopts, bash 2.03 заметил, что пример:

#!/bin/sh

ARGS=$(getopt -n $(basename "$0") -o 'dD:mM:' -- "$@")
[ $? = 0 ] || exit 1
eval set -- "$ARGS"

while [ "$1" != -- ]; do
case "$1" in
-d) USE_ADV=1;;
-D) ADV_DIC=$2; shift; USE_ADV=1;;
-m) USE_MAIN=1;;
-M) MAIN_DIC=$2; shift; USE_MAIN=1;;
esac
shift
done
shift

echo "USE_ADV=$USE_ADV"
echo "ADV_DIC=$ADV_DIC"
echo "USE_MAIN=$USE_MAIN"
echo "MAIN_DIC=$MAIN_DIC"


Успешно работает в Linux.

getopt -V
getopt из util-linux 2.21.2


Код: Выделить всё

> ./getopt.sh -m -d
USE_ADV=1
ADV_DIC=
USE_MAIN=1
MAIN_DIC=


Во freebsd 8.1 не работает.

Код: Выделить всё

$ ./getopt.sh -m -d
USE_ADV=
ADV_DIC=
USE_MAIN=
MAIN_DIC=

/usr/bin/getopt -V
 --


Проблема в том, что хочу использовать как короткие опции -h, так и длинные --help

Если отойти от getopt, то остается использовать только while [ -n "$1"]; do case esac shift; done, так как getopts длинные опции не поддерживает, либо воспользоваться:

Код: Выделить всё

!/bin/bash
while getopts ":n:d:-:" OPTION; do
    case "$OPTION" in
        -)  case "$OPTARG" in
                name) echo LONG_NAME="${!OPTIND}";;
                dir)  echo LONG_DIR="${!OPTIND}" ;;
            esac;;
        n)  echo SHORT_NAME="$OPTARG" ;;
        d)  echo SHORT_DIR="$OPTARG" ;;
    esac
done


Какой путь наиболее оптимальный, как можно поправить getopt во FreeBSD?
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: getopt|s или while

Сообщение drBatty »

lgar писал(а):
28.09.2013 17:17
Какой путь наиболее оптимальный, как можно поправить getopt во FreeBSD?

Вы уверенны, что тут вообще скрипт оптимален? ИМХО пора уже читать GETOPT(3), и писать нормальную утилиту на сишке, которая будет нормально работать в любой нормальной ОС.

ИМХО это проще, чем делать мультиплатформенный скрипт. И быстрее.

ЗЫЖ ИМХО.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Ответить