Корректный способ проверить на командную строку отмечает в ударе

Посреди сценария я хочу проверить, был ли данный флаг передан командной строке. Следующее делает то, что я хочу, но кажется ужасным:

if echo $* | grep -e "--flag" -q
then
  echo ">>>> Running with flag"
else
  echo ">>>> Running without flag"
fi

Существует ли лучший путь?

Примечание: Я явно не хочу перечислять все флаги в switch/getopt. (В этом случае любые такие вещи стали бы половиной или большим количеством полного сценария. Также тела, если просто установленный ряд Вара)

39
задан DanAl 5 March 2018 в 07:37
поделиться

3 ответа

Я обычно вижу это с помощью оператора 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

Обратите внимание, что это позволяет вам проверять как короткие, так и длинные флаги. Другие параметры в этом случае создаются с использованием дополнительной переменной .

9
ответ дан 27 November 2019 в 02:31
поделиться

В 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
6
ответ дан 27 November 2019 в 02:31
поделиться

Альтернатива тому, что вы делаете:

if [[ $* == *--flag* ]]

См. также BashFAQ/035.

Примечание: Это также будет соответствовать --flags-off, поскольку это простая проверка подстроки.

59
ответ дан 27 November 2019 в 02:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: