当我在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
型
我只是想对十六进制数做这件事。我很困惑为什么没有前导零被打印到终端。从我的研究来看,看起来我有正确的代码,只是不是正确的输出。
2条答案
按热度按时间4sup72z81#
在bash中,不需要使用
bc
来计算不同于10的基数。在您的号码前使用前缀base#
。字符串
测试结果
型
更新
您可以使用
%05X
化程序而不是%5X
来获得以下结果:型
注意事项
语法
printf -v var_name "format" ...
比var_name=$(printf "format" ...)
更快更漂亮。只有当您的shell或操作系统不支持printf
和-v
选项时,才使用第二种形式。要使用
-v
选项,您需要使用bash。检查您的printf
版本:型
你必须使用bash bultin函数。非
/usr/bin/printf
命令bvhaajcl2#
为什么没有前导零被打印到终端
字符串
0
仅适用于整数和浮点数填充。你不能指望它能和s
一起工作。您正在使用的printf
忽略了0
和s
,并且完全有权这样做。让我们抛出一个引用,来自https://en.cppreference.com/w/c/io/fprintf:
0:对于整数和浮点数转换,前导零用于填充字段,而不是空格字符。对于整数,如果显式指定了精度,则忽略该值。对于其他转换,使用此标志会导致未定义的行为。如果存在- flag,则忽略它。