Bạn có thể sử dụng bash-BUILTIN printf
với các tùy chọn -v
để viết nó vào một biến chứ không phải in nó để đầu ra tiêu chuẩn:
pax> inputNo=5 ; printf -v inputNo "%02d" $inputNo ; echo $inputNo
05
pax> inputNo=102 ; printf -v inputNo "%02d" $inputNo ; echo $inputNo
102
Bạn sẽ muốn đảm bảo đó là số đầu tiên nếu không chuyển đổi sẽ không thành công. Nếu bạn muốn để có thể pad bất kỳ chuỗi ra hai hoặc nhiều ký tự, bạn cũng có thể sử dụng:
while [[ ${#inputNo} -lt 2 ]] ; do
inputNo="0${inputNo}"
done
mà về cơ bản là một vòng lặp while
rằng tiền tố chuỗi của bạn với "0" cho đến khi chiều dài lớn hơn hoặc bằng hai.
Lưu ý rằng điều này cũng có thể được thực hiện trong bash
bằng cách đặt trước số với hai số không sau đó chỉ cần nhận được hai ký tự cuối cùng của chuỗi, kiểm tra đầu tiên mà nó chưa được tối thiểu kích thước mong muốn:
if [[ ${#inputNo} -lt 2 ]] ; then
inputNo="00${inputNo}"
inputNo="${inputNo: -2}"
fi
Sự khác biệt có lẽ không quá lớn đối với số có hai chữ số nhưng bạn có thể thấy giải pháp thứ hai tốt hơn nếu bạn cần chiều rộng lớn hơn.
Nếu bạn đang sử dụng một vỏ khác hơn bash
(không, dựa trên các thẻ của bạn), bạn sẽ cần phải tìm ra tương đương, hoặc trở lại với việc sử dụng các quy trình bên ngoài để làm việc, cái gì đó như :
while [[ $(echo -n ${inputNo} | wc -c) -lt 2 ]] ; do
inputNo="0${inputNo}"
done
này làm cơ bản những gì bạn đang nghĩ ra trong câu hỏi của bạn, nhưng lưu ý việc sử dụng -n
trong lệnh echo
để ngăn chặn các ký tự dòng mới (được gần như chắc chắn gây off-by-one của bạn lỗi).
Nhưng, như đã nêu, đây là vị trí lùi. Nếu bạn đang sử dụng bash
, các đề xuất trước đây của tôi có lẽ là tốt nhất.
Cảm ơn! Hoạt động tuyệt vời. – Mint
Không cần các quy trình bên ngoài trong trường hợp chung: 'while test" $ {# inputNo} "-lt 2; do inputNo = "0 $ inputNo"; done' (* [[* thay đổi thành * test * với trích dẫn thêm để làm cho nó tương thích với nhiều shell hơn). –
Không cần mở rộng bash ($ {# ...}): 'case $ inputNo in [0-9]) inputNo =" 0 $ inputNo ";; *) ;; esac'. – Idelic