44

テキスト ファイル test.txt には、次の情報があります。

sl-gs5 desconnected Wed Oct 10 08:00:01 EDT 2012 1001

次のコマンドラインでイベントの時間を抽出したい:

hour=$(grep -n sl-gs5 test.txt | tail -1 | cut -d' ' -f6 | awk -F ":" '{print $1}')

そして「08」が出ました。1を足そうとすると、

 14 echo $((hour+1))

次のエラー メッセージが表示されます。

./test2.sh: line 14: 08: value too great for base (error token is "08")

Bash の変数が型指定されていない場合、なぜですか?

4

8 に答える 8

105

の算術評価を参照してman bashください。

先頭に 0 がある定数は、8 進数として解釈されます。

パラメータ展開によって先頭のゼロを削除できます。

hour=${hour#0}

または base-10 解釈を強制します。

$((10#$hour + 1))
于 2012-10-10T14:29:00.737 に答える
17

私はハックと呼んでいますが、時間の値のみを処理していることを考えると、次のことができます

 hour=08
 echo $(( ${hour#0} +1 ))
 9
 hour=10 
 echo $(( ${hour#0} +1))
 11

リスクはほとんどありません。

IHTH。

于 2012-10-10T14:31:08.980 に答える
10

使用することもできますbc

hour=8
result=$(echo "$hour + 1" | bc)
echo $result
9
于 2014-08-09T13:07:58.157 に答える
3

文字列の int 値を取得する最も美しい方法ではありませんが、これは簡単な方法です。

hour=`expr $hour + 0`

bash-3.2$ hour="08"
bash-3.2$ hour=`expr $hour + 0`
bash-3.2$ echo $hour
8
于 2016-05-07T19:11:59.803 に答える