Посреди сценария я хочу проверить, был ли данный флаг передан командной строке. Следующее делает то, что я хочу, но кажется ужасным:
if echo $* | grep -e "--flag" -q
then
echo ">>>> Running with flag"
else
echo ">>>> Running without flag"
fi
Существует ли лучший путь?
Примечание: Я явно не хочу перечислять все флаги в switch/getopt. (В этом случае любые такие вещи стали бы половиной или большим количеством полного сценария. Также тела, если просто установленный ряд Вара)
Я обычно вижу это с помощью оператора case. Вот отрывок из сценария git-repack :
while test $# != 0
do
case "$1" in
-n) no_update_info=t ;;
-a) all_into_one=t ;;
-A) all_into_one=t
unpack_unreachable=--unpack-unreachable ;;
-d) remove_redundant=t ;;
-q) GIT_QUIET=t ;;
-f) no_reuse=--no-reuse-object ;;
-l) local=--local ;;
--max-pack-size|--window|--window-memory|--depth)
extra="$extra $1=$2"; shift ;;
--) shift; break;;
*) usage ;;
esac
shift
done
Обратите внимание, что это позволяет вам проверять как короткие, так и длинные флаги. Другие параметры в этом случае создаются с использованием дополнительной переменной
.
В bash можно использовать ключевое слово getopt.
Из http://aplawrence.com/Unix/getopts.html :
getopt
Это автономный исполняемый файл, который существует уже давно. В старых версиях отсутствует возможность обработки аргументов в кавычках (foo a "this не будет работать "c) и версии, которые могут, сделайте это неуклюже. Если вы если вы используете последнюю версию Linux, ваш "getopt" может это сделать; ШОС OSR5, Mac OS X 10.2.6 и FreeBSD 4.4 имеют более старую версию, которой нет.
Простое использование "getopt" показано в этом мини-скрипте:
#!/bin/bash
echo "Before getopt"
for i
do
echo $i
done
args=`getopt abc:d $*`
set -- $args
echo "After getopt"
for i
do
echo "-->$i"
done
Альтернатива тому, что вы делаете:
if [[ $* == *--flag* ]]
См. также BashFAQ/035.
Примечание: Это также будет соответствовать
--flags-off
, поскольку это простая проверка подстроки.