2009-12-14 40 views
13

如何檢查int變量($ inputNo)以查看它是否是2個或更多個十進制數字?確保int變量的長度是2位數,否則在前面加上0使其長度爲2位數

例子:

inputNo="5" 

應改爲:05

inputNo="102" 

應該只剩下了102

我想過使用wcif語句,但wc -m不似乎將實際字符傳遞到wc,因爲wc總會看到ms給予給出的字符+1。

但是我不知道如何在當前輸入數字前加0。

回答

32

您可以使用與bash內置printf-v選項將其寫入到一個變量,而不是將其打印到標準輸出:

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

您需要確保它是數字第一,否則轉換將失敗。如果您希望能夠墊任何串出兩個或多個字符,你也可以使用:

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

這基本上是一個while循環與前綴的字符串「0」,直到長度大於大於或等於兩個。

注意,這也可以在bash的前綴來兩個零數目,然後簡單地得到該字符串的最後兩個字符,首先檢查它不是已經至少所需的大小進行:

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

兩位數字的差別可能不是太大,但如果您需要更大的寬度,您可能會發現後一種解決方案更好。


如果您使用的是外殼其他bash(不可能的,根據你的標籤),你需要找到等價物,或恢復使用外部進程做工作,像:

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

這基本上你在你的問題中想什麼關閉,但注意在echo命令使用-n防止尾隨換行符(這是幾乎可以肯定導致你差一錯誤)一樣。

但是,如上所述,這是一個倒退的位置。如果您使用的是bash,我以前的建議可能是最好的。

+0

謝謝!很棒。 – Mint 2009-12-14 03:24:42

+0

在一般情況下不需要外部進程:'while while test「$ {#inputNo}」-lt 2; do inputNo =「0 $ inputNo」;完成'(* [[*更改爲*測試*添加引用以使其與更多炮彈兼容)。 – 2009-12-14 04:26:04

+0

不需要bash擴展($ {#...}):[case case 0 inputNo in [0-9])inputNo =「0 $ inputNo」;; *);; esac'。 – Idelic 2009-12-14 14:37:11

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 2009-12-14 03:25:33

6

對於通用填充該字符串是否是數字或不

無需管道echowc或使用while循環。

在Bash中,你可以得到這樣一個字符串的長度:${#inputNo}

而且因爲你可以做子,你可以這樣做,而不是:

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