Я пытаюсь написать скрипт, в котором я хочу проверить, соответствует ли какой-либо из параметров, переданных скрипту bash, строке. То, как я сейчас это настроил,
if [ "$3" != "-disCopperBld" -a "$4" != "-disCopperBld" -a "$5" != "-disCopperBld" -a "$6" != "-disCopperBld"]
но может быть большое количество параметров, поэтому мне было интересно, есть ли лучший способ сделать это?
Спасибо
РЕДАКТИРОВАТЬ: я попробовал этот кусок кода, и вызвал сценарий с параметром -disableVenusBld, но он по-прежнему выводит «Начиная сборку». Я делаю что-то неправильно? Заранее спасибо!
while [ $# -ne 0 ]
do
arg="$1"
case "$arg" in
-disableVenusBld)
disableVenusBld=true
;;
-disableCopperBld)
disableCopperBld=true
;;
-disableTest)
disableTest=true
;;
-disableUpdate)
disableUpdate=true
;;
*)
nothing="true"
;;
esac
shift
done
if [ "$disableVenusBld" != true ]; then
echo "Starting build"
fi
linux
unix
bash
shell-script
iman453
источник
источник
#! /bin/sh -
в начало того, что вы там включили, сделал исполняемый скрипт, затем./t.sh
напечатал «Starting build», но./t.sh -disableVenusBld
ничего не печатал.Ответы:
Похоже, вы выполняете обработку опций в скрипте оболочки. Вот идиома для этого:
(Есть несколько соглашений для отступа
;;
, и некоторые оболочки позволяют вам давать варианты как(--opt1)
, чтобы помочь с сопоставлением скобок, но это основная идея)источник
shift
Оператор используется , когда число аргументов команды не известно заранее, например , когда пользователь может дать столько аргументов , сколько им нравится. В таких случаях аргументы обрабатываются вwhile
цикле с условием проверки$#
. Это условие выполняется до тех пор, пока количество аргументов больше нуля.$1
Переменная иshift
оператор обрабатывает каждый аргумент. Число аргументов уменьшается каждый раз, когдаshift
выполняется, и в итоге становится равным нулю, после чегоwhile
цикл завершается. источникecho $1 | sed
обработкой значения аргумента .Это сработало для меня. Он делает именно то, что вы просили, и ничего более (без обработки опций). Хорошо это или плохо - упражнение для плаката :)
Это использует преимущества специальной обработки
$*
и супер-теста bash[[
…]]
скобок.источник
$*
на$@
, так как тестируемая строка может иметь пробелы и добавить ссылку на документацию bash об этом.bash -c 'echo args=$*; [[ "$@" == "bar" ]] && echo YES || echo NO' -- foo bar
your string
. Я думаю, что вам нужно сделать то, что предлагает этот ответ . т.е.bash -c 'echo args=$*; for i in "$@" ; do [[ $i == "bar" ]] && echo "Is set!" && break ; done' -- bar foo
будет работать.create a new certificate
и «ваша строка»cat
, это сообщит о совпадении, посколькуcertificate
содержитcat
.Как насчет поиска (с подстановочными знаками) всего пространства параметров:
Изменить: Хорошо, хорошо, так что это не был популярный ответ. Как насчет этого, это прекрасно!
Edit2: Хорошо, хорошо, возможно, это не идеально ... Думаю, что это работает, только если -param находится в начале списка и также будет соответствовать -paramXZY или -paramABC. Я все еще думаю, что оригинальная проблема может быть решена очень хорошо с манипулированием строк bash, но я не совсем взломал это здесь ... -Можете?
источник
${@#
)?$@
это специальная переменная, которая содержит все аргументы командной строки? Ну, я только что использовал манипуляции строк Bash для этой переменной, чтобы удалить подстроку «-disableVenusBld», а затем сравнил ее с оригиналом$@
. Так что, если$@
равен,-foo -bar
то${@#-disableVenusBld}
все равно будет-foo -bar
, так что я вижу, что флаг, который я ищу, отсутствует. Однако, если$@
равно,-foo -disableVenusBld -bar
то${@#-disableVenusBld}
было бы,-foo -bar
что не равно$@
, таким образом говоря мне, что флаг, который я ищу, присутствует! Круто ах!Если вам нужно проверить только параметры, начиная с
$3
, выполните поиск в функции:Но мне интересно, почему вы пытаетесь сделать это в первую очередь, это не является общей необходимостью. Обычно вы обрабатываете варианты по порядку, как в ответе Денниса на предыдущий вопрос .
источник