![Bash 스크립트 한 자리 또는 두 자리 숫자를 받아 두 자리로 만드는 방법](https://linux55.com/image/85135/Bash%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%20%ED%95%9C%20%EC%9E%90%EB%A6%AC%20%EB%98%90%EB%8A%94%20%EB%91%90%20%EC%9E%90%EB%A6%AC%20%EC%88%AB%EC%9E%90%EB%A5%BC%20%EB%B0%9B%EC%95%84%20%EB%91%90%20%EC%9E%90%EB%A6%AC%EB%A1%9C%20%EB%A7%8C%EB%93%9C%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
특정 입력에 대해 이상한 내 스크립트에서 다음과 같은 간단한 발췌문을 추출했습니다.
echo -e "Enter the Day of the Month : \c "
read input_day
printf -v input_day '%02d' "$input_day"
이렇게 하면 사용자가 단일 숫자(예: 2)를 입력하면 해당 숫자가 02로 변환됩니다. 이것이 나의 첫 번째 요청입니다. 이는 02와 같은 두 자리 숫자를 입력하는 경우에도 작동합니다. 그러면 02에 그대로 두겠습니다. 이는 12와 같은 2자리 숫자에도 적용됩니다. 그런데 이상한 점은 숫자 08과 09를 받아들일 수 없다는 점이죠? 08이나 09를 입력했을 때 나타나는 에러입니다.
Enter the Day of the Month : 08
2: line 20: printf: 08: invalid number
왜 그럴까요? printf 도움말 페이지를 읽으려고 시도했는데 "d"가 부호 있는 십진 정수를 의미한다는 것을 보여줍니다. 따라서 숫자 8과 9를 허용해야 합니다. 아니면 내가 뭔가를 놓치고 있는 걸까? 내 요구 사항은 사용자가 한 자리 "8"과 두 자리 "08"로 날짜를 입력할 수 있어야 한다는 것입니다.
답변1
bash
앞에 0이 있는 숫자는 8진수로 해석됩니다. 형식이 문제가 아니라 $input_day
변수가 문제입니다.
다양한 방법을 사용하여 제거할 수 있습니다(예를 들어 참조).awk는 C의 LTRIM 함수와 동일합니다.).
추가 자료:
iptables에 변수를 전달하기 전에 선행 0을 제거하십시오.
다음 구문을 사용하세요$((10#$machinenumber))
. 예를 들어, 다음과 같습니다.printf -v input_day '%02d' "$((10#$input_day))"
Bash: 변수에서 선행 0을 제거합니다.
더 중요한 것은:shopt -s extglob printf -v input_day '%02d' ${input_day##+(0)}
그런데 예제에서는 변수가 비어 있는지 확인하지 않습니다. 그러나 이것을 올바르게 검증하는 것은 또 다른 문제가 될 것입니다.