1. ホーム
  2. bash

[解決済み] 値がベースに対して大きすぎる(エラートークンは "08")[重複]

2022-02-09 15:01:45

質問

ここで私の問題は、if文の中でシングルブラケット[ ]とダブルブラケット[[ ]]を使用することの違いを見つけることです。

#!/bin/bash
vara=08;
varb=10;

## single bracket in if statment is working.
if [ $vara -lt $varb ]; then
echo "yes";
else
echo "no";
fi


## double brackets in if statment is not working; throwing an error like below.
## [[: 08: value too great for base (error token is "08")
if [[ $vara -lt $varb ]]; then
echo "yes";
else
echo "no";
fi

解決方法は?

シェルは08を0から始まる8進数として解釈しようとします。しかし、8進数で許されるのは0~7桁だけで、10進数の8は8進数の010になります。従って、08は有効な数字ではなく、これがエラーの原因です。

シングルブラケットはshとの互換モードであり、shは8進数について知らないのです。

そのため、片角括弧を使用すると "010" は 10 と解釈され、両角括弧を使用すると "010" は 8 と解釈されることになるのです。

角括弧を1つだけ使用した場合、"08"は8と解釈され、角括弧を2つ使用した場合は有効な数字ではないのでエラーになります。

ここで紹介する解決策を使えば、エラーを回避することができます。 https://stackoverflow.com/a/12821845/1419315

if [[ ${vara#0} -lt ${varb#0} ]]

または

if [[ $((10#$vara)) -lt $((10#$varb)) ]]