다음을 사용한 새로운 답변%08.0f

다음을 사용한 새로운 답변%08.0f

숫자에 0을 채우려고 합니다.

a=010
printf "%04d" $a
0008

값을 변환하는 "0010"이 "출력"이 필요합니다.

조판도 시도했지만

a=010
typeset -RZ2 a
echo $a

내 스크립트에서 동일한 것을 사용하면 다음 오류가 발생합니다.

Invalid -R option

답변1

숫자 시작 부분에 "0"을 넣지 마십시오. 숫자는 다음과 같이 처리됩니다.8진수에 따르면. 십진수를 지정하면 됩니다.

a=10    
printf "%04d" $a    
0010    

다른 곳에서 숫자를 읽는 경우 다음과 같이 앞에 오는 0을 제거하는 것이 좋습니다.

a=0010    
b=$(echo $a | sed 's/^0*//')    
printf "%04d" $a    
0008
printf "%04d" $b    
0010    

답변2

다음을 사용한 새로운 답변%08.0f

인쇄용%f10진수 부동 소수점 수, 토론이어야 한다소수.

따라서 주장을 다음과 같이 해석하는 데 위험이 없습니다.8진수:

간단히 다음을 수행하십시오.

a=0010

a=`printf %08.0f $a` 

또는

a=$(printf %08.0f $a)

그 다음에

echo $a
00000010

이 직업은 어느 곳에서나 찾을 수 있습니다.POSIX

아래에

사용-v, 다음 옵션을 사용하여 포크를 방지할 수 있습니다 printf.

a=0010
printf -v a %08.0f $a
echo $a
00000010

이전 답변(사용됨 %d)

POSIX 하에서

0다음을 사용하여 왼쪽 문자를 제거할 수 있습니다.

a=00010
while [ "$a" != "${a#0}" ] ;do a=${a#0};done
printf "%08d" $a
00000010

이는 새 명령 세션을 분기하지 않으므로 를 사용하는 것보다 나을 수 있습니다 sed.

아래에

다음 구문을 사용하여 십진수 해석을 강제할 수 있습니다.

a=000010
printf "%08d" $((10#$a))
00000010

이는 변환에 유용할 수 있습니다.

a="0a"
printf "%04d" $((16#$a))
0010

a="00001010"
printf "%04d" $((2#$a))
0010

a="00012"
printf "%04d" $((8#$a))
0010

a="0020"
printf "%04d" $((5#$a))
0010

a="0013"
printf "%04d" $((7#$a))
0010

등...

a="zz"
printf "%04d" $((36#$a))
1295

답변3

다른 변환 지정자(예: "f" 지정자)를 사용하여 이를 달성할 수 있습니다. ~에서매뉴얼 인쇄:

,에프

double 인수는 반올림되어 [-]ddd.ddd 스타일의 십진수 표기법으로 변환됩니다. 여기서 소수점 문자 뒤의 자릿수는 정밀도 사양과 같습니다. 정밀도가 없으면 6이 사용됩니다. 정밀도가 명시적으로 0이면 소수점 문자가 표시되지 않습니다. 소수점이 표시되는 경우 소수점 앞에 최소한 한 자리가 와야 합니다.

그러나 우리는 실제로 숫자의 부동 소수점 표현을 원하지 않으므로 정밀도를 0으로 지정해야 합니다. 이렇게 하면 트릭을 수행할 수 있습니다.

a=010
printf "%04.0f" $a

나는 당신이 Linux를 사용하고 있다고 가정하지만 이것은 다른 버전의 Unix에서도 작동할 것입니다.

답변4

typeset -Z4 azsh또는 와 함께 사용 됩니다 ksh.

POSIX sh 및 printf에서 숫자로 해석될 때 앞에 0이 있으면 8진수로 해석됩니다. 따라서 0먼저 다음을 삭제해야 합니다.

printf '%04d\n' "${a#"${a%%[!0]*}"}"

awk또는 이 문제 없이 사용할 수 있습니다 .

awk 'BEGIN{printf "%04d\n", ARGV[1]}' "$a"

관련 정보