#!/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?