Nói tóm lại, printf %100s
sẽ in 100 dấu cách và tr " " "="
sẽ chuyển đổi các khoảng trắng đó thành các dấu bằng nhau, in hiệu quả 100 dấu bằng.
Phá vỡ nó:
printf
là một vỏ tích hợp. Nó thường có hai hoặc nhiều đối số, trong đó đối số đầu tiên là "chuỗi định dạng" và phần còn lại sẽ được sử dụng để điền vào chỗ dành sẵn trong chuỗi định dạng đó. Khi mẫu đó được điền đầy đủ, nó sẽ in ra kết quả. Nếu có nhiều đối số còn lại, nó sẽ bắt đầu lại, điền vào nhiều đối số hơn và in chuỗi kết quả.
Chuỗi định dạng được sử dụng để printf
lấy thông số kỹ thuật định dạng, bắt đầu bằng %
và kết thúc bằng một chữ cái, %d
có nghĩa là một số nguyên (sử dụng cơ sở thập phân, do đó "d"), %f
có nghĩa là số dấu phẩy động và %s
có nghĩa là một chuỗi ký tự. Các ký tự không phải là chữ cái sau các %
từ bổ nghĩa cho đặc tả định dạng và đặc biệt, các số được sử dụng để chỉ định độ dài yêu cầu của trường trên đầu ra. Vì vậy, %100s
sẽ định dạng chuỗi có ít nhất 100 ký tự, nó sẽ đệm chuỗi đó bằng dấu cách và nó sẽ giữ cho chuỗi được căn chỉnh đúng (nói cách khác, thêm khoảng trắng ở đầu chuỗi.)
Nếu thông qua một đối số phụ, nó sẽ sử dụng nó cho %s
trường đó , vì vậy, ví dụ printf %100s abc
sẽ in 97 khoảng trắng (để có tổng số 100, xem xét 3 trong "abc") theo sau là chuỗi "abc" thực tế. Nhưng nếu không có đối số nào được đưa ra, thì đặc tả định dạng được điền bằng một đối số rỗng hoặc null (là một chuỗi trống cho %s
, nó sẽ là 0 cho %d
, v.v.) Vì vậy, điều đó giống như khi một chuỗi trống được thông qua, chẳng hạn như printf %100s ''
. Kết quả cuối cùng là chỉ có phần đệm 100 ký tự được in.
Vì vậy, đặt tất cả lại với nhau, printf %100s
kết quả trong 100 không gian được in.
Bây giờ tr
là một công cụ để dịch các ký tự từ đầu vào sang đầu ra. Phải mất hai đối số, SET1 và SET2, mỗi bộ một ký tự và sau đó dịch ký tự đầu tiên của SET1 thành ký tự đầu tiên của SET2, ký tự thứ hai của SET1 thành thứ hai của SET2, v.v. tr
đọc đầu vào của nó từ stdin và ghi lại vào stdout (vì vậy nó rất hữu ích trong các đường ống như ở trên.) tr
sẽ luôn dịch tất cả các lần xuất hiện của ký tự đó trong một chuỗi đã cho.
Ví dụ, tr aeiou 12345
sẽ dịch nguyên âm chữ thường thành các số từ 1 đến 5 theo thứ tự đó, vì vậy nó sẽ dịch "xếp hàng" thành "q52523ng" chẳng hạn. Bạn cũng có thể chuyển phạm vi ký tự của nó, chẳng hạn như tr a-z A-Z
để biến bất kỳ chữ cái viết thường nào thành chữ hoa tương ứng.
Vì vậy, tr " " "="
chỉ đơn giản là dịch các không gian thành các dấu bằng trong suốt chuỗi. Không gian đầu tiên cần được trích dẫn để được công nhận là một đối số. Các =
không thực sự cần phải được trích dẫn, nhưng làm như vậy không bị tổn thương. tr " " =
sẽ làm việc như vậy.
Đặt tất cả lại với nhau, in 100 khoảng trắng, sau đó dịch từng khoảng đó thành các dấu bằng nhau.
Hy vọng rằng điều này giải thích nó đủ chi tiết, nhưng nếu vẫn còn điều gì đó bạn không hiểu, vui lòng để lại nhận xét và tôi sẽ cố gắng giải quyết vấn đề đó.
printf '%100s' ' ' | tr " " "="