linux 使用printf获取填充0的问题

nbysray5  于 2023-08-03  发布在  Linux
关注(0)|答案(2)|浏览(170)

当我在linux bash中输入以下脚本时,我没有得到预期的结果:
(脚本)

branch_line_number=01A
val=$(echo "obase=16; ibase=16; $branch_line_number + 1" | bc -l)
sum=$(printf "%03s" $val)
echo "check 6 val = $val : sum = $sum"

字符串
(结果)

check 6 val = 1B : sum =  1B


(Note:有一个空格,在“和”中应该有一个零)
我尝试使用以下方法:

branch_line_number=01A
val=$(echo "obase=16; ibase=16; $branch_line_number + 1" | bc -l)
sum=$(printf "%03x" $val)
echo "check 6 val = $val : sum = $sum"


导致:

line 4: printf: 1B: invalid number check 6 val = 1B : sum = 001


我也尝试过:

branch_line_number=01A
val=$(echo "obase=16; ibase=16; $branch_line_number + 1" | bc -l)
sum=$(printf "%05s" $val)
echo "check 6 val = $val : sum = $sum"


导致:

check 6 val = 1B : sum =    1B


(Note:“sum”中应该有一个零的地方有3个空格)
奇怪的是,我尝试了以下脚本:

branch_line_number=016
val=$(echo "obase=16; ibase=16; $branch_line_number + 1" | bc -l)
sum=$(printf "%05d" $val)
echo "check 6 val = $val : sum = $sum"


我得到这个结果:

check 6 val = 17 : sum = 00017


我只是想对十六进制数做这件事。我很困惑为什么没有前导零被打印到终端。从我的研究来看,看起来我有正确的代码,只是不是正确的输出。

4sup72z8

4sup72z81#

在bash中,不需要使用bc来计算不同于10的基数。在您的号码前使用前缀base#

branch_line_number=01A
printf -v sum "%5X" $(( 16#$branch_line_number + 1 ))
echo "sum = $sum"

字符串
测试结果

sum = 1B

更新

您可以使用%05X化程序而不是%5X来获得以下结果:

sum = 0001B

注意事项

语法printf -v var_name "format" ...var_name=$(printf "format" ...)更快更漂亮。只有当您的shell或操作系统不支持printf-v选项时,才使用第二种形式。
要使用-v选项,您需要使用bash。检查您的printf版本:

> type printf
printf is a shell builtin


你必须使用bash bultin函数。非/usr/bin/printf命令

bvhaajcl

bvhaajcl2#

为什么没有前导零被打印到终端

printf "%05s"

字符串
0仅适用于整数和浮点数填充。你不能指望它能和s一起工作。您正在使用的printf忽略了0s,并且完全有权这样做。
让我们抛出一个引用,来自https://en.cppreference.com/w/c/io/fprintf
0:对于整数和浮点数转换,前导零用于填充字段,而不是空格字符。对于整数,如果显式指定了精度,则忽略该值。对于其他转换,使用此标志会导致未定义的行为。如果存在- flag,则忽略它。

相关问题