2009-07-12 41 views
46

Tôi đang viết một tập lệnh bash để nhận một số podcast. Vấn đề là một số các số podcast là một chữ số trong khi những số khác là hai/ba chữ số, vì vậy tôi cần phải đệm chúng để làm cho chúng có tất cả 3 chữ số.Chèn các số 0 vào một chuỗi

tôi thử như sau:

n=1 

n = printf %03d $n 

wget http://aolradio.podcast.aol.com/sn/SN-$n.mp3 

nhưng biến 'n' không ở lại đệm vĩnh viễn. Làm thế nào tôi có thể làm cho nó vĩnh viễn?

Trả lời

59

Sử dụng backticks gán kết quả của lệnh printf (``):

n=1 
wget http://aolradio.podcast.aol.com/sn/SN-`printf %03d $n`.mp3 

EDIT: Lưu ý rằng tôi loại bỏ một dòng mà không phải là thực sự cần thiết. Nếu bạn muốn gán đầu ra của 'printf% ...' đến n, bạn có thể sử dụng

n=`printf %03d $n` 

và sau đó, sử dụng $ n thay biến bạn sử dụng trước đó.

+3

Tại sao không: 'wget $ (printf http://aolradio.podcast.aol.com/sn/SN-%03d $ n.mp3, $ n) '. Chỉ cần đặt toàn bộ URL trong câu lệnh 'printf'. –

4
n=`printf '%03d' "2"` 

Lưu ý khoảng cách và backticks

28

Có vẻ bạn đang gán giá trị trả về của lệnh printf (đó là mã thoát của nó), bạn muốn gán đầu ra của printf.

bash-3.2$ n=1 
bash-3.2$ n=$(printf %03d $n) 
bash-3.2$ echo $n 
001 
+8

+1 để sử dụng $() - nó thích hợp hơn để trả lại số tiền –

+2

Tại sao $() lại thích hợp hơn? – bli

+2

@bli Nó có thể được lồng nhau, trong khi backticks không thể (ít nhất là không phải không có một số hình thức thoát) – Neil

3

Như đã đề cập bởi noselad, xin vui lòng chỉ huy thay thế, ví dụ: $ (...), là một lợi thế vì nó supercedes backtics, ví dụ: `...`.

Dễ dàng hơn khi làm việc với nhiều lần thay thế lệnh thay vì thoát, ví dụ: "backslashing", backtics.

15

Chú ý mặc dù chuỗi đầu vào của bạn có số 0 đứng đầu!
printf sẽ vẫn làm đệm, nhưng cũng chuyển đổi chuỗi của bạn thành định dạng bát phân số hex .

# looks ok 
$ echo `printf "%05d" 03` 
00003 

# but not for numbers over 8 
$ echo `printf "%05d" 033` 
00027 

Một giải pháp cho điều này có vẻ là in nổi thay vì số thập phân.
Bí quyết bỏ qua vị trí thập phân với .0f.

# works with leading zero 
$ echo `printf "%05.0f" 033` 
00033 

# as well as without 
$ echo `printf "%05.0f" 33` 
00033 
+1

Đó là bởi vì printf mất "0n" như bát phân. bát phân 33 = số thập phân 27. Không phải hex. – cde

3

để tránh bối cảnh chuyển đổi:

a="123" 
b="00000${a}" 
c="${b: -5}" 
Các vấn đề liên quan