Как работают логические операторы bash (или почему они здесь не работают)? - PullRequest
1 голос
/ 21 января 2011

У меня есть следующий скрипт-обертка:

#!/bin/bash

$local_time=`date +%H%M`
if [ $local_time -ge 1430 ] && [ $local_time -le 2230 ] ||
   [ $local_time -ge 0300 ] && [ $local_time -le 0400 ]
then
   echo 'pass'
else
   echo 'skip'
fi

Идея состоит в том, чтобы создать скрипт-обертку, который запускает скрипт между двумя непересекающимися интервалами времени.Каждое из выражений, являющихся OR'd, оценивается правильно, однако, когда я ИЛИ оба выражения, тест не пройден.

Как мне это исправить?

Ответы [ 3 ]

7 голосов
/ 21 января 2011

У вас две проблемы

  1. Вы не присваиваете своим переменным $, когда назначаете их, только когда вы расширяете их
  2. Вам необходимо установить приоритет оператора с помощью паренов ( )

Кроме того, поскольку вы уже используете bash, он может также использовать его лучший синтаксис с конструкцией (( )), которая позволяет вам использовать операторы сравнения < > == !=, и вы можете использовать $() для подстановки команд вместо спины / надгробия

#!/bin/bash

local_time=$(( 10#$( date +'%H%M' ) ))
if (( ( local_time >=    1430 && local_time <=    2230 ) ||
      ( local_time >= 10#0300 && local_time <= 10#0400 )    ))
then
  echo 'pass'
else
  echo 'skip'
fi

Числа, начинающиеся с нуля, интерпретируются как восьмеричные.
Кроме того, любое число, начинающееся с 0 и содержащее 8 или 9, выдает ошибку.
Префикс (10 #) решает это.

0 голосов
/ 10 мая 2016

Вам просто нужно установить правильный приоритет с парой скобок:

#!/bin/bash

local_time=$(date +%H%M)
if ( [ "$local_time" -ge 1430 ] && [ "$local_time" -le 2230 ] ) ||
   ( [ "$local_time" -ge 0300 ] && [ "$local_time" -le 0400 ] )
then
   echo 'pass'
else
   echo 'skip'
fi

Причина: внутри списка И-ИЛИ && и || имеют одинаковый приоритет.
Примечание. Внутри [ ] числа, начинающиеся с 0, не интерпретируются как восьмеричные.

Другие изменения:

  • В левой части равенства должно быть только имя переменной (№ $).
  • Рекомендуется использовать $() вместо ``.
  • Кавычки внутри переменных [ ].
0 голосов
/ 21 января 2011

bash не имеет «логических операторов»;это "условные цепочки".Логика принадлежит в тесте.

if [[ ( 10#${local_time} -ge 10#1430 && 10#${local_time} -le 10#2230 ) || \
      ( 10#${local_time} -ge 10#0300 && 10#${local_time} -le 10#0400 ) ]]
then
 ...
...