Если вы хотите найти пакеты, содержащие целое слово (например, найти perl, но не sooperlooper), вы можете включить границы слов в шаблон поиска:
$ aptitude search '\bperl\b'
Aptitude также поддерживает множество условий поиска, как описано в справочном руководстве. , которые позволяют вам изменить, где именно он ищет ваш шаблон. Например, чтобы найти Perl для вашей системы, попробуйте:
$ aptitude search "?exact-name(perl) ?architecture(amd64)"
Для интерпретации команд с двойным тире вам понадобится GNU getopt
вместо встроенного -в getopts
.
Существует способ использовать встроенную команду bash getopts
для имитации длинных опций, но вы не должны этого делать, так как это бесполезно и не стоит ваших усилий, поскольку getopts
не может обеспечить длинную спецификацию..
Итак, ваш сценарий становится:
#!/bin/bash
# Get options
OPTS=`getopt --options an: --long a_something,n_something_else: -n 'parse-options' -- "$@"`
if [ $? != 0 ] ; then echo "Failed parsing options." >&2 ; exit 1 ; fi
#echo parsed and cleaned up options
echo "$OPTS"
eval set -- "$OPTS"
bSomething=false
bSomethingElse=false
# "Endless" loop over the parsed options
while true; do
case "$1" in
-a | --a_something ) bSomething=true; shift ;;
-n | --n_something_else ) bSomethingElse=true; shift ;;
-- ) shift; break ;;
* ) break ;;
esac
done
Для получения дополнительной информации:man getopt
Для получения дополнительной информации:man getopt(3)
Не понимаю, почему нельзя смоделировать длинные варианты, рассматривая -
как короткий вариант, требующий аргумента:
$ cat /tmp/foo
while getopts :aq:-: opt; do
case $opt in
a) echo option -a;;
q) echo option -q with value "$OPTARG";;
-) case $OPTARG in
abc) echo option --abc;;
def=*) echo option --def with value "${OPTARG#*=}";;
*) echo >&2 "unknown option --$OPTARG";;
esac;;
:) echo >&2 "-$OPTARG needs an argument";;
*) echo >&2 "unknown option -$OPTARG";;
esac
done
shift "$((OPTIND - 1))"
echo argv: "$@"
$ sh /tmp/foo -a -qt --abc --def=ghi -- foo bar
option -a
option -q with value t
option --abc
option --def with value ghi
argv: foo bar
Если вы хотите составить список аргументов (, например. для вызова другой команды с ним ), и ваша оболочка не поддерживает массивы (, например. debian или busybox /bin/sh
), вы можете использовать следующий трюк, который будет передавать для оценки список индексов аргументов вместо фактических строк; это позволит избежать любых неприятностей, связанных с разделением/подстановкой/пробелом IFS:
$ cat /tmp/foo
# handle -a and -qval
# call another command with any long options and non-option arguments
av=
while getopts :aq:-: opt; do
case $opt in
a) echo option -a;;
q) echo option -q with value "'$OPTARG'";;
-) av="$av \"\${$((OPTIND-1))}\"" ;; # pass long options unchanged
:) echo >&2 "-$OPTARG needs an argument";;
*) echo >&2 "unknown option -$OPTARG";;
esac
done
i=$OPTIND; while [ "$i" -le "$#" ]; do av="$av \"\${$i}\"" i=$((i + 1)); done
print_its_args(){ for a; do printf ' {%s}' "$a"; done; echo; }
echo "print_its_args $av"
eval "print_its_args $av"
Тогда:
$ sh /tmp/foo -aqval --foo='a ** b' --abc -- '(moo)'
option -a
option -q with value 'val'
print_its_args "$2" "$3" "$5"
{--foo=a ** b} {--abc} {(moo)}
Этот прием можно использовать и в других ситуациях ; но это тот случай, когда более простое решение, такое как set -- "$@" arg
для передачи аргументов в $@
, не может быть использовано, потому что изменение$@
внутри цикла getopts
не может быть выполнено переносимым способом.