저는 현재 약간 덜 "이상하게" 작동하는 다음 코드에 대한 대안을 찾고 있습니다.
printf "Please enter the ticket number:\t"; read vTICKET; vTICKET=$(printf %04d "$vTICKET"); printf "$vTICKET\n";
입력으로 입력 하면 072
이것이 표시됩니다.
Please enter the ticket number: 072
0058
입력이나 명령에 더 관대할 수 있는 다른 방법이 있는지 궁금합니다 read
. printf
실제로 문자열 길이를 테스트하지 않고 앞에 0을 추가하는 멋진 방법인 것 같습니다.
답변1
입력 값의 앞에 0이 있으면 쉘은 이를 8진수로 해석합니다.
10#
예를 들어 다음을 사용하여 십진수 변환을 강제 할 수 있습니다 .
$ printf "Please enter the ticket number:\t"; read vTICKET; vTICKET=$(printf %04d "$((10#$vTICKET))" ); printf "$vTICKET\n";
Please enter the ticket number: 072
0072
Bash에서는 예를 들어 a의 결과를 printf
변수에 직접 할당할 수 있습니다.-v
printf -v vTICKET %04d "$((10#$vTICKET))"
당신은 또한 볼 수 있습니다Bash가 정수 대신 8진수 코드를 해석하지 못하게 하는 방법은 무엇입니까?
답변2
Bash에서는 앞에 오는 0을 삭제할 수 있습니다. 첫 번째 설정 후 extglob
:
$ shopt -s extglob
매개변수 확장 시 after를 사용할 수 있습니다 *(0)
.##
$ read -r TICKET; printf "%.4d\n" "${TICKET##*(0)}"
000000000000000000000000000000000000072
0072
완료되면 다음 명령을 사용하여 정상으로 돌아갈 수 있습니다 extglob
.
$ shopt -u extglob
이제 *(0)
기본 경로 이름 확장을 다시 수행하십시오.
$ read -r TICKET; printf "%.4d\n" "${TICKET##*(0)}"
asdfasdf(0)72
0072
$ read -r TICKET; printf "%.4d\n" "${TICKET##*(0)}"
asdfasdf072
bash: printf: asdfasdf072: invalid number
0000