簡體   English   中英

Bash printf:如何理解零點s(“%0.s”)語法

[英]Bash printf: how to understand zero dot s (“%0.s”) syntax

使用Bash printf ,我不知道如何理解以下代碼的語法。

echo $(printf "%0.s../"  2  ); 
# ../
echo $(printf "%0.s../"  );   
# ../
echo $(printf "%0.s../" 1 );
# ../

man printf閱讀,

...

小號
將打印來自字符串參數的字節,直到達到末尾或達到精度規范指示的字節數為止; 但是,如果精度為0或缺少精度,則將完全打印字符串。

...

而且我仍然不知道上面的代碼。

為什么下面的代碼反復打印?

# repeating character 
echo $(printf "%0.s../" 1 2  );
# ../../

https://wiki.bash-hackers.org/commands/builtin/printf看到

...

點:加上字段寬度,當文本較長時,字段不會擴展,而是將文本截斷。 “%.s”是未記錄的等效於“%.0s”,它將強制字段寬度為零,從而有效地將字段隱藏在輸出中

...

還沒有。 我需要一些解釋。

此示例可以闡明width字段的工作原理

printf '%.0s../\n' ABCDEFG
../
printf '%.1s../\n' ABCDEFG
A../
printf '%.2s../\n' ABCDEFG
AB../
printf '%.7s../\n' ABCDEFG
ABCDEFG../

當寬度為0時,則根本不打印該字段。

然后,如果參數多於字段,則printf重復格式

printf '%.7s../\n' ABCDEFG abcdefg
ABCDEFG../
abcdefg../

你有什么是具有為的情況下,格式說明比實際參數少於的經典問題

printf "%0.s../" 1 2

Bash與參數一對一地應用說明符規則,但是如果匹配不正確,說明符規則基本上會被復制,就像它以

printf "%0.s../../" 1

您需要為2添加一個額外的說明符

printf "%0.s..%0.s/" 1 2

在這種情況下,由於格式設置規則匹配,您只會得到一個../輸出。

至於語法%0.s ,似乎已經截斷了您所提供的參數字符串。 您的邏輯唯一的問題是上述錯誤的說明符。 在外殼中打印長值時,寬度字段更有意義,在外殼中,精確度由寬度字段控制。 例如

printf '%4.2f\n' 1323.343233
1323.34

當您的數字由點前的4位數字和最多2的精度數字組成時, printf()理解。

您無需首先echoprintf()的輸出。 您可以在末尾使用格式說明符\\n來打印換行符。

printf "%0.s..%0.s/\n" 1 2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM