숫자에 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
인쇄용%f
10진수 부동 소수점 수, 토론이어야 한다소수.
따라서 주장을 다음과 같이 해석하는 데 위험이 없습니다.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 a
zsh
또는 와 함께 사용 됩니다 ksh
.
POSIX sh 및 printf에서 숫자로 해석될 때 앞에 0이 있으면 8진수로 해석됩니다. 따라서 0
먼저 다음을 삭제해야 합니다.
printf '%04d\n' "${a#"${a%%[!0]*}"}"
awk
또는 이 문제 없이 사용할 수 있습니다 .
awk 'BEGIN{printf "%04d\n", ARGV[1]}' "$a"