입력 및 출력 오류:
14:00:11,320 14:00:11,453
**Correct Output** : Time difference is 133 milli seconds.
14:00:13,097 14:00:13,124
**Output in Error** : line 4: 124000000 - 097000000: value too great for base (error token is "097000000")
14:00:11:693 14:00:13:048
**Output in Error** : line 4: 048000000: value too great for base (error token is "048000000")
사용된 스크립트:
g=$(( $(date -d $b +%s) - $(date -d $a +%s) ))
h=$(( $(date -d $b +%N) - $(date -d $a +%N) ))
k=$(( (g * 1000) + (h / 1000000) ))
printf "Total time difference: %i milli seconds\n" $k
답변1
0
당신 말이 맞습니다. 이 수학은 bash 및 대부분의 다른 쉘에서 실패합니다. 왜냐하면 숫자가 다음으로 시작하는 C 규칙을 따르기 때문입니다.8진수, 십진수 아님:
$ echo "$((124000000 - 097000000))"
bash: 124000000 - 097000000: value too great for base (error token is "097000000")
한 가지 해결책은 bash할 숫자를 기본 10으로 올바르게 식별하는 것입니다.
$ echo "$((10#124000000 - 10#097000000))"
27000000
문제는 10#
접두사가 없으면 bash는 0으로 시작하는 숫자를 8진수로 가정한다는 것입니다.
또는 다음을 사용하십시오 bc
.
$ echo "124000000 - 097000000" | bc -l
27000000
아니면 awk를 사용하세요:
$ echo "124000000 097000000" | awk '{print $1-$2}'
27000000
수학과 printf를 결합:
$ g=124000000
$ h=097000000
$ printf "Total time difference: %i milli seconds\n" "$(echo "$g - $h" | bc -l )"
Total time difference: 27000000 milli seconds
또는,
$ g=124000000
$ h=097000000
$ echo "$g $h" | awk '{printf "Total time difference: %i milliseconds\n",$1-$2}'; )
Total time difference: 27000000 milli seconds
문서
에서 man bash
:
0으로 시작하는 상수는 8진수로 해석됩니다. 앞에 0x 또는 0X가 있으면 16진수를 나타냅니다. 그렇지 않은 경우 숫자는 [base#]n 형식을 취합니다. 여기서 선택적 밑은 산술 밑을 나타내는 2~64 사이의 십진수이고 n은 해당 밑의 숫자입니다.
수학과 날짜 결합
$ echo "$(( $(date -d '14:00:13.124' '+10#%s%N') - $(date -d '14:00:13.097' '+10#%s%N') ))"
27000000
나노초를 밀리초로 변환하려면:
$ echo "$(( ($(date -d '14:00:13.124' '+10#%s%N') - $(date -d '14:00:13.097' '+10#%s%N'))/1000000 ))"
27
$ echo "$(( ($(date -d '14:00:05.320' '+10#%s%N') - $(date -d '14:00:04.909' '+10#%s%N'))/1000000 ))"
411