13

私のbashスクリプトには次のロジックがあります。

#!/bin/bash
local_time=$(date +%H%M)

if (( ( local_time > 1430  && local_time < 2230 ) || ( local_time > 0300 && local_time < 0430 ) )); then
 # do something
fi

時々、タイトルで指定されたエラーが表示されます (上記のいずれかの時点08xxでエラーが発生するように見えます)。

これを修正する方法について何か提案はありますか?

Ubuntu 10.04 LTS で実行しています

[編集]

SiegeX の提案に従ってスクリプトを変更したところ、次のエラーが発生しまし[: 10#0910: integer expression expectedた。

何か助けはありますか?

4

3 に答える 3

17

bash先行ゼロのため、数字を8進数として扱っています

からman bash

先頭に 0 がある定数は、8 進数として解釈されます。先頭の 0x または 0X は 16 進数を表します。それ以外の場合、数値は [base#]n の形式を取ります。ここで、base は算術基数を表す 2 ~ 64 の 10 進数で、n はその基数の数値です。base# を省略すると、base 10 が使用されます。

これを修正するには、base-10 プレフィックスを指定します

#!/bin/bash
local_time="10#$(date +%H%M)"

if (( ( local_time > 1430  && local_time < 2230 ) || ( local_time > 0300 && local_time < 0430 ) )); then
 # do something
fi
于 2011-03-28T07:24:06.100 に答える
4

このブログからのアドバイスに従って、これは機能します:

#!/bin/bash
local_time=`date +%H%M`
local_time="$(( 10#$local_time ))"

if (( ( local_time > 1430  && local_time < 2230 ) || ( local_time > 0300 && local_time < 0430 ) )); then
    echo "it is time!"
fi
于 2012-09-11T15:16:57.683 に答える
1

条件付きテスト内で問題を解決する

さまざまな理由 (ファイル命名の問題など) により、変数をそのままにしておくことを余儀なくされる場合があります。この場合、base を明示的に指定して、条件付きテスト内で問題を解決します。 10#

#!/bin/bash
local_time=$(date +%H%M)

if (( ( 10#${local_time} > 1430  && 10#${local_time} < 2230 ) || ( 10#${local_time} > 0300 && 10#${local_time} < 0430 ) )); then
 # do something
fi
于 2016-02-29T06:27:18.220 に答える