Shell

需要解釋如何在 POSIX shell 中重複一個字元

  • February 15, 2021

Stack Overflow 上的以下回答,

如何在bash中重複一個字元?

強加了一種合理的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 個空格。


Nowtr是一個將字元從輸入轉換為輸出的工具。它接受兩個參數,SET1 和 SET2,每個參數是一組字元,然後將 SET1 的第一個字元轉換為 SET2 的第一個字元,將 SET1 的第二個字元轉換為 SET2 的第二個字元,依此類推。tr從標準輸入讀取其輸入並將其寫回標準輸出(因此它在像上面這樣的管道中非常有用。)tr將始終翻譯給定字元串中該字元的所有出現。

例如,tr aeiou 12345將小寫元音按順序轉換為數字 1 到 5,因此它會將“queueing”轉換為“q52523ng”。您還可以將字元範圍傳遞給它,例如tr a-z A-Z將任何小寫字母轉換為相應的大寫字母。

因此tr " " "=",只需將整個字元串中的空格轉換為等號即可。第一個空格需要被引用才能被辨識為參數。=實際上不需要引用,但這樣做並沒有什麼壞處。tr " " =本來也一樣。


將它們放在一起,列印 100 個空格,然後將每個空格轉換為等號。

希望這可以足夠詳細地解釋它,但是如果您仍有不明白的地方,請發表評論,我會盡力解決。

引用自:https://unix.stackexchange.com/questions/492630