Аргумент может содержать пробел, поэтому либо используйте встроенную команду оболочки getopts
, либо расширенную версию внешней программы getopt
, расширенную GNU.
Параметр getopts
более переносим,не все системы имеют расширенную версию GNU getopt
.Например, Linux имеет расширенную версию GNU, а Mac OS X - нет.Оригинальная версия getopt
не поддерживает пробелы.Несмотря на это ограничение, есть причина, по которой вы можете использовать расширенную версию GNU: она поддерживает длинные имена опций, а getopts
- нет.
. Как использовать расширенную версию GNU getopt
с пробелами.Важно использовать "$@"
(используйте $ @ вместо $ * и убедитесь, что вокруг него заключены двойные кавычки) и eval
всю команду set
, чтобы все пробелы обрабатывались правильно.
eval set -- `getopt --long currdir:,dir:,argval:,verbose -o c:d:k:v -- "$@"`
while [ $# -gt 0 ]
do
case "$1" in
-c | --currdir) CURRDIR="$2"; shift;;
-d | --dir) MYDIR="$2"; shift;;
-k | --argval) ARGVAL="$2"; shift;;
-v | --verbose) VERBOSE=yes;;
esac
shift
done