[英]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()
理解。
您無需首先echo
顯printf()
的輸出。 您可以在末尾使用格式說明符\\n
來打印換行符。
printf "%0.s..%0.s/\n" 1 2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.