需要解釋如何在 POSIX shell 中重複一個字元
Stack Overflow 上的以下回答,
強加了一種合理的POSIX方式-ly 重複單個字元,如下所示。在這個例子中,讓我們使用等號 100 次:
printf %100s | tr " " "="
我的問題是我不明白它是如何工作的,我更喜歡簡單的解釋。請不要發表評論,例如閱讀手冊,我這樣做了,由於我對此並不聰明,所以我問這個問題,因為我從未使用過
tr
,也沒有見過這樣的printf
聲明。
簡而言之,
printf %100s
將列印 100 個空格,tr " " "="
並將這些空格轉換為等號,從而有效地列印 100 個等號。分解它:
printf
是一個內置的shell。它通常需要兩個或多個參數,第一個是“格式字元串”,其餘的將用於填充該格式字元串中的佔位符。一旦該模板完全填充,它將列印出結果。如果還有更多參數,它將重新開始,填充更多參數並列印結果字元串。用於的格式字元串採用
printf
格式規範,%
以單個字母開頭和結尾,因此%d
表示整數(使用十進制基數,因此為“d”),%f
表示浮點數並%s
表示字元串。之後的字元以外的字元%
是格式規範的修飾符,特別是數字用於指定輸出欄位的請求長度。所以%100s
會將字元串格式化為至少有 100 個字元,它會用空格填充它並保持對齊(換句話說,在字元串的開頭添加空格。)如果傳遞了一個額外的參數,它將用於該
%s
欄位,例如printf %100s abc
將列印 97 個空格(總共 100 個,考慮到“abc”中的 3 個),然後是實際的字元串“abc”。但是如果沒有給出參數,那麼格式規範將填充一個空或 null 參數(對於 ,它是一個空字元串,對於%s
,它將是 0%d
等)所以這與傳遞一個空字元串相同,例如printf %100s ''
. 最終結果是只列印了 100 個字元的填充。因此,將它們放在一起,將
printf %100s
列印 100 個空格。Now
tr
是一個將字元從輸入轉換為輸出的工具。它接受兩個參數,SET1 和 SET2,每個參數是一組字元,然後將 SET1 的第一個字元轉換為 SET2 的第一個字元,將 SET1 的第二個字元轉換為 SET2 的第二個字元,依此類推。tr
從標準輸入讀取其輸入並將其寫回標準輸出(因此它在像上面這樣的管道中非常有用。)tr
將始終翻譯給定字元串中該字元的所有出現。例如,
tr aeiou 12345
將小寫元音按順序轉換為數字 1 到 5,因此它會將“queueing”轉換為“q52523ng”。您還可以將字元範圍傳遞給它,例如tr a-z A-Z
將任何小寫字母轉換為相應的大寫字母。因此
tr " " "="
,只需將整個字元串中的空格轉換為等號即可。第一個空格需要被引用才能被辨識為參數。=
實際上不需要引用,但這樣做並沒有什麼壞處。tr " " =
本來也一樣。將它們放在一起,列印 100 個空格,然後將每個空格轉換為等號。
希望這可以足夠詳細地解釋它,但是如果您仍有不明白的地方,請發表評論,我會盡力解決。