Люди обычно думают о передаче флагов как аргументов в программу, т.е.
myShellScript -o (options) flag1 flag2 file1 file2 file...n
Это требует управления аргументами как опциями, с помощью оператора case или вызова getopts
и других специализированных функций. Поиск здесь в SO для поиска getopts должен дать вам всю необходимую информацию об этом.
То, что я обсуждаю ниже, предполагает, что вы можете изменить свои сценарии, чтобы они помещали в переменные $ {ACTION}, которые я называю переменными флага. Как вы упомянули об условных действиях, по этой причине я говорю о переменных флага, использующих «true» или «false» для управления выполнением блока кода. Если вы понимаете эти концепции, вам не составит труда изменить ваш код для условно запускаемых процессов с наименьшим количеством модификаций кода. Если вы приведете нам конкретный пример small «Мне нужен мой код для условного выполнения ...», я и другие сотрудники могут легко помочь вам решить ваши проблемы.
Таким образом, другой способ, возможно, более подходящий для вас, состоит в том, чтобы настроить среду вашего сценария так, чтобы любые необходимые переменные были видны процессу шеллскрипта. Вы можете сделать это двумя разными способами.
установить стандартные переменные среды и экспортировать их до того, как вы вызовете свой скрипт, т.е.
flag1=true ; flag2=false ; export flag1 flag2
myShellScript file1 file2 file...n
(file1 -> file..n может не потребоваться для вашего сценария оболочки)
ИЛИ «передать» переменные флага в ваш шеллскрипт как часть вызова вашего скрипта
flag1=true flag2=false myShellScript file1 file2 file...n
Чтобы использовать любой из этих методов, вам нужно использовать переменные-флажки, например
if ! ${flag1:-false} ; then
print "Skipping flag one code"
else
print "Inside flag one code, doing stuff"
fi
:-
является оператором параметра оболочки, который говорит: «Если flag1 не существует или установлен на« », временно использовать значение сразу после этого :-
, в данном случае false .
Используя наши 2 пронумерованных метода, описанных выше, flag1 имеет значение true, поэтому замена временного не происходит.
Обратите внимание, что если вы используете технику 1, вы установили flag1 как имеющее значение (true), и единственный способ «выключить» это установить его с другим значением. запись :-
никогда не вступит в силу. Вы должны были бы сбросить flag1 из командной строки, чтобы снова увидеть работу :-
. Это может сбивать с толку, когда вы используете командную строку для тестирования кода, поэтому обязательно всегда сбрасывайте переменные, которые вы ожидаете обработать с любым из модификаторов параметров (есть и другие).
Если вы не привыкли использовать операторы, разрешающие if true then ; print "true" ; fi
, здесь есть несколько объяснений.
Порядок оценки оболочки ищет переменные, т. Е. $ {Flag1}, и подставляет любые значения, которые он находит, для этих переменных. Таким образом, используя if ${flag1:-false} ; then
... переменная найдена, она не имеет значения, поэтому затем подставляется значение false . Значение false преобразуется в команду /bin/false
, поэтому эта команда выполняется. Единственная цель - вернуть ненулевой код выхода.
Вы можете проверить многое из этого, используя вашу командную строку, включив отладку, с помощью set -vx
и поигравшись. Вот быстрый пример.
**# Shell built-ins**
/home/Shellter :>which true
true
/home/Shellter :>which false
false
# which point to
/home/Shellter :>srchpath true
-rwxrwxr-x 1 Shellter None 17 Jan 13 2009 /usr/bin/true
/home/Shellter :>srchpath false
-rwxrwxr-x 1 Shellter None 17 Jan 13 2009 /usr/bin/false
#turn on debugging mode
/home/Shellter :>set -vx
# test true and false at the most basic level
# then what is the exit code?
/home/Shellter :>true
true
[1]+ true
/home/Shellter :>echo $?
echo $?
[1]+ echo 0
0
/home/Neil_2 :>false
false
[1]+ false
/home/Neil_2 :>echo $?
echo $?
[1]+ echo 1
1
/home/Shellter :>unset myFlag
unset myFlag
[1]+ unset myFlag
/home/Shellter :>if ${myFlag:-false} ; then print "found true value" ; else print "found false value" ; fi
if ${myFlag:-false} ; then print "found true value" ; else print "found false value" ; fi
[1]+ false
[1]+ print 'found false value'
found false value
# set myFlag
/home/Shellter :>myFlag=true
myFlag=true
[1]+ myFlag=true
/home/Shellter :>if ${myFlag:-false} ; then print "found true value" ; else print "found false value" ; fi
if ${myFlag:-false} ; then print "found true value" ; else print "found false value" ; fi
[1]+ true
[1]+ print 'found true value'
found true value
Надеюсь, это поможет.
P.S. поскольку вы выглядите новым пользователем, если вы получите ответ, который поможет вам, помните, пожалуйста, пометьте его как принятый или поставьте + (или -) в качестве полезного ответа