Я прочитал много ответов на конкретные c варианты использования логического или условного синтаксиса в bash, но ни один из них не был признан наилучшей практикой, которая понадобилась бы многим (если вы этого не сделаете, я предлагаю вам прочитать эти вопросы, прежде чем продолжить с этим первый: поиск bash логических переменных и условных выражений и чтение первых пяти).
Сложность состоит в том, что bash не имеют одного, но много противоречивого, противоречивого и нелогичного синтаксиса для этого, хорошо отраженного в противоречивых ответах в SE.
Цель: знание того, что bash не имеет логических типов, но содержит условные операторы, операторы, коды состояния и функции, чтобы определить наилучший синтаксис для широкого использования логического исчисления и условного контроля выполнения в сценарии bash , Широкое распространение означает, что его можно использовать в командах условного управления, а также в переменных и операторах.
Передовой опыт должен соответствовать всем этим требованиям IMO в порядке наибольшей важности:
- сжато, если для операторов и троичный оператор?:
- краткое назначение и вызов переменных с логическим значением
- сжатые операторы булевого исчисления или, и, не, и круглые скобки с кодами возврата состояния команды и переменными
примеры конкурирующего синтаксиса:
- операторы:
if [[
if [
if command
if $variable
- назначения:
t=true
t=1
t=$(true)
t=''
t=0
- операторы:
[ true -a false ]
( true && false )
(( true * false ))
Итак, какой синтаксис будет наилучшим для использования, например, для этого практического примера, но в других местах? :
boolresutl1=if commandA or ( $numvarB > $numvarC ) then true
boolresult2=commandD
boolresult3=whatever
if boolresult1 or boolresult2 and not boolresult3 then blabla
Наилучший ответ также продемонстрирует, что рабочие альтернативы предложенной передовой практике будут слишком многословными.
РЕДАКТИРОВАТЬ: здесь приведен фрагмент кода, который работает, но все еще может в ясности и краткости.
Цель логики - установить переменную keepFILE на основе набора временных условий на дату изменения файла и политики хранения файлов на годовой, квартальный, ежемесячный, еженедельный и ежедневный. И удалите файлы, не соответствующие этому условию. Моим ключевым выбором при разработке сценария было значение для истинного условия, между NULL (удовлетворяющим, если $ var, но не [[$ var]]), или "true" (удовлетворяющим [[$ var]], но не, если $ var) .
# date -d @12345 (seconds since epoch) formats: +%u (7= Sunday) +%d (01= 1st dom) +%m (01=Jan)
unset isY isQ isM isW
# is beg of Week ?
[[ "$(date -d @$filedatesecs +%u)" = 7 ]] && isW=true
# is beg of Month ?
[[ "$(date -d @$filedatesecs +%d)" = 01 ]] && isM=true
# is beg of Quarter ?
[[ $isM && $(date -d @$filedatesecs +%m) =~ ^(01|04|07|10)$ ]] && isQ=true
# is beg of Year ?
[[ $isM && "$(date -d @$filedatesecs +%m)" = 01 ]] && isY=true
unset keepD keepW keepM keepQ keepY keepFILE
[[ $fileagedays -le $maxdaysD ]] && keepD=true
[[ $fileagedays -le $maxdaysW ]] && [[ $isW ]] && keepW=true
[[ $fileagedays -le $maxdaysM ]] && [[ $isM ]] && keepM=true
[[ $fileagedays -le $maxdaysQ ]] && [[ $isQ ]] && keepQ=true
[[ $fileagedays -le $maxdaysY ]] && [[ $isY ]] && keepY=true
[[ $keepD || $keepW || $keepM || $keepQ || $keepY ]] && keepFILE=true