2009-12-14 4 views
13

int 변수 ($ inputNo)를 검사하여 10 진수가 2 자리 이상인지 확인하려면 어떻게합니까?int 변수가 2 자리 길이인지 확인하십시오. 그렇지 않으면 0을 앞에 추가하여 2 자리 길이로 만듭니다.

예 : 05

inputNo="102" 

는 혼자해야 하는가 :

inputNo="5" 

로 변경해야 하는가 102

내가 wcif 문을 사용하는 방법에 대한 생각했지만 wc -m하지 않습니다 wc에 전달 된 실제 문자를 제공하는 것처럼 보입니다. 항상 보니 wc입니다. ms는 주어진 문자에 +1을줍니다.

그러나 현재 입력 번호 앞에 0을 추가하는 방법을 모르겠습니다.

답변

32

당신은 변수에 쓸 -v 옵션과 함께 bash는-내장 printf를 사용하는 대신 표준 출력에 인쇄 할 수 있습니다

pax> inputNo=5 ; printf -v inputNo "%02d" $inputNo ; echo $inputNo 
05 
pax> inputNo=102 ; printf -v inputNo "%02d" $inputNo ; echo $inputNo 
102 

먼저 숫자가 맞는지 확인하십시오. 그렇지 않으면 변환이 실패합니다. 두 개 이상의 문자에서 패드 어떤 문자열로 할 수 있도록하려면, 당신은 또한 사용할 수 있습니다 귀하의 문자열을 접두사 while 루프가 기본적으로

while [[ ${#inputNo} -lt 2 ]] ; do 
    inputNo="0${inputNo}" 
done 

이 "0"길이가 클 때까지 2보다 크거나 같다.

if [[ ${#inputNo} -lt 2 ]] ; then 
    inputNo="00${inputNo}" 
    inputNo="${inputNo: -2}" 
fi 

:이 또한 단순히 문자열의 마지막 두 문자를 받고 두 개의 제로와 수를 접두어로 이미 적어도 원하는 크기 아니라고 먼저 확인하여 bash에서 수행 될 수 있다는

주 두 자리 숫자의 차이가 너무 큰 것은 아니지만 큰 너비가 필요한 경우 후자의 솔루션이 더 좋을 수 있습니다.


당신이 쉘을 사용하는 경우 다른bash 이상 (태그에 따라 가능성), 당신은 등가물을 찾거나 같은, 뭔가를 일을하는 외부 프로세스를 사용하여 복귀해야합니다 :

while [[ $(echo -n ${inputNo} | wc -c) -lt 2 ]] ; do 
    inputNo="0${inputNo}" 
done 

이 기본적으로 당신이 당신의 질문에 떨어져 생각하지만 (거의 확실히 오프별로 한 오류의 원인이 된) 후행 줄 바꿈을 방지하기 위해 echo 명령 -n의 사용을주의하고 있었는지 않습니다.

그러나 앞에서 설명한 것처럼이 위치는 폴백 위치입니다. bash을 사용하는 경우 이전에 제안한 것이 가장 좋습니다.문자열이 숫자인지 범용 패딩

+0

감사합니다. 훌륭하게 작동합니다. – Mint

+0

일반적으로 외부 프로세스가 필요 없습니다. while test "$ {# inputNo}"-lt 2; do inputNo = "0 $ inputNo"; done '(* [* *는 더 많은 쉘과 호환되도록 인용문을 추가하여 * test *로 변경되었습니다). –

+0

bash 확장 ($ {# ...})을위한 필요가 없습니다 : [0-9]에서'case $ inputNo) inputNo = "0 $ inputNo";; *) ;; esac'. – Idelic

1

당신은 거기에서 http://bash-hackers.org/wiki/doku.php/commands/builtin/printf, 예를 사용할 수 있습니다

the_mac="0:13:ce:7:7a:ad" 

# lowercase hex digits 
the_mac="$(printf "%02x:%02x:%02x:%02x:%02x:%02x" 0x${the_mac//:/ 0x})" 

# or the uppercase-digits variant 
the_mac="$(printf "%02X:%02X:%02X:%02X:%02X:%02X" 0x${the_mac//:/ 0x})" 
+0

감사를 링크, 나는 항상 기능이 작동하고 무엇을 모두 할 수있는 방법을 읽을 것을 좋아합니다. – Mint

6

여부

wcecho 배관 또는 while 루프를 사용하는 필요가 없습니다.

배시에서 다음과 같은 문자열 길이를 얻을 수 있습니다 : ${#inputNo}.

그리고 당신은 문자열을 할 수 있기 때문에, 대신이 작업을 수행 할 수 있습니다

if [[ ${#input} < 2 ]] 
then 
    inputNo="00${inputNo}" 
    inputNo="${inputNo: -2}" 
fi 
관련 문제