2011-01-21 53 views
1

我有以下包裝器腳本:bash的邏輯運算符是如何工作的(或者他們爲什麼不在這裏工作)?

#!/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的表達式都被正確評估,但是,當我或兩個表達式都測試失敗時。

我該如何解決這個問題?

回答

6

你有兩個問題

  1. 當你爲他們分配你不加撥$的變量,只有當你擴大他們
  2. 您需要強制執行與括號()
  3. 運算符優先級

此外,由於您已經在使用bash,所以不妨使用其更好的語法,(())構造全部OWS您使用比較運算符< > == !=並可以使用$()爲命令替換代替反引號的/ gravemarks

#!/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#)解決了這個問題。

+3

一個很好的介紹更「現代」的Bash是這樣的:http://mywiki.wooledge.org/BashGuide – Telemachus 2011-01-21 20:40:00

0

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 
... 
0

你只需要執行正確的優先順序與一對夫婦括號:

#!/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 

原因:內部的AND,OR列表&&||具有相同的優先級。
注意:在[ ]內部以0開頭的數字不會被解釋爲八進制數。

其他變化:

  • 平等的左側應該只是變量名(無$)。
  • 建議使用$()而不是``
  • 引用[ ]中的變量。