8진수

8진수

0에서 9 사이의 숫자가 항상 0...9 대신 00...09로 표시되어야 하는 새 변수를 만들려고 합니다. 다음은 POC 목적으로 실제 명령을 사용하지 않은 테스트입니다.

for i in {00..23}; do hourPlus=$((i+1)); echo $i $hourPlus; done

어떤 출력:

00   1
01   2
02   3
03   4
04   5
05   6
06   7
07   8
08   9
09   10
10   11
11   12
12   13
13   14
14   15
15   16
16   17
17   18
18   19
19   20
20   21
21   22
22   23
23   24

그러나 내가 기대하는 것은 다음과 같습니다.

00   01
01   02
02   03
03   04
04   05
05   06
06   07
07   08
08   09
09   10
10   11
11   12
12   13
13   14
14   15
15   16
16   17
17   18
18   19
19   20
20   21
21   22
22   23
23   24

내 for 루프에서 예상대로 작동하도록 하는 방법을 아는 사람이 있나요?

답변1

다음은 당신을 위한 기능입니다:

two_digits_zero_fill ()
{
    # print the number as a string with a leading zero
    printf '%02d\n' "$1"
}

더 일반적인 경우는 다음과 같습니다.

leading_zero_fill ()
{
    # print the number as a string with a given number of leading zeros
    printf "%0$1d\\n" "$2"
}

후자의 사용법:

number=7
leading_zero_fill 3 "$number"

다음을 인쇄합니다:

007

답변2

에코 부분을 다음으로 교체하십시오.

printf '%02d %02d\n' $i $hourPlus

편집: 실제로 hourPlus의 최종 값을 사용하지 않는 한:

for i in {0..23}; do printf '%02d %02d\n' $i $((i + 1)); done

답변3

(ksh93에서는 사용 가능하지만 ksh지원되지 않음) 또는 (확장 소스)를 사용하십시오. 예:{00..23}{0..23%02d}zsh{00..23}

typeset -Z2 var

그 다음에:

$ var=0
$ echo "$var"
00
$ ((var++))
$ echo "$var"
01

산술 확장이 아닌 변수 확장에만 영향을 미칩니다.

$ echo "$((var+1))"
2

이 변수는 또한잘린두 자리 숫자로:

$ var=123
$ echo "$var"
23
zsh$ echo $((var)) # value is still 123, only the expansion is truncated
123
ksh$ echo "$((var))" # value truncated upon assignment
23

에서는 길이 2의 확장명이 0이고 잘린 왼쪽 패드를 zsh참조하세요 .${(l:2::0:)expansion}

POSIXly에서는 언제든지 다음을 사용할 수 있습니다.

printf '%02d\n' "$var"

하지만 그렇지 않다는 점 참고해주세요자르기최대 2자리(대부분의 경우에도 마찬가지)이며 10진수 정수 문자열에서만 작동합니다.

조심하세요:

$ bash -c "printf '%02d\n' 010"
08

(yash, dash 또는 GNU와 동일하며 printf이는 실제로 POSIX 요구 사항입니다.)

답변4

특정 유형의 형식을 얻으려면 구체적으로 문의해야 합니다.

$int너비가 채워지지 않은 경우 앞에 0( )이 있는 n 비트의 고정 너비 정수를 인쇄하려면 다음을 수행할 수 있습니다.

printf '%0*d' "$n" "$int"

예:

$ printf '%0*d' 4 25
0025

$ printf '%0*d' 10 7
0000000007

임의의 숫자를 인쇄하세요하나선행 0:

$ printf '0%d' 7
07

8진수

그러나 쉘(ksh 및 zsh 제외)에서는 숫자로 08인해 오류가 발생합니다.

$ dash -c 'i=08; echo $((i+1))'
dash: 1: Illegal number: 08

이는 일부 쉘에서 0으로 시작하는 숫자가 기본 8(8진수) 숫자로 해석되기 때문입니다. 8진수에서는 숫자 8이 존재하지 않습니다. 따라서 수학을 수행하려면 bc와 같은 다른 방법이 필요합니다.

$ i="008"; echo "$i + 1 " | bc
9

간단히 말해서 다음과 같은 것이 필요합니다.

for i in {00..23}; do hP=$( echo "$i+1" |bc ); printf '%s %02d\n' "$i" "$hP"; done

관련 정보