사용자 입력에 선행 0을 추가하지만 변환을 위해 printf를 사용함

사용자 입력에 선행 0을 추가하지만 변환을 위해 printf를 사용함

저는 현재 약간 덜 "이상하게" 작동하는 다음 코드에 대한 대안을 찾고 있습니다.

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변수에 직접 할당할 수 있습니다.-vprintf -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

관련 정보