format 命令
0赞format: 根据一组格式说明来格式化字符串,此命令不会改变被操作字符串的内容。
语法:format spec value1 value2...
其中spec包含了格式说明关键词和附加文字,使用%来引入一个关键词,后跟0个或多个修饰符,然后使用一个转换格式符结尾。
关键词的基本格式是:“%aaaB" ,aaa表示修饰符,B表示一种格式转换符
valueX是变元,其关键词可以多达6部分:位置说明符、标志、字段宽度、精度、长度、转换符。
例如:format ”%8x“20 ;#将20转换为十六进制数,8位数据宽度,右对齐。如果是-8x表示左对齐。
第一条回复的针对的format格式: format formatString ?arg arg ...?
----------------------------------------------------------------------------------------------------
关于此回复体会几点:
1、The command operates by scanning formatString from left to right.从左到右的这个顺序
2、conversion specifier。转换符,百分号后的字符被当作转换符。基本上一个%对应后面的一个arg(或者value),每个arg根据%后的转换符指定的格式替换转换符。
3、每个转换符(conversion specifier)最多可包含6个不同的部分:an XPG3 position specifier, a set of flags, a minimum field width, a precision, a size modifier, and a conversion character.除了转换字符(conversion character)任何部分都可以忽略。所有出现的部分,必须按照上述顺序出现,在该回复中详细介绍了各个部分。
4、If the % is followed by a decimal number and a $, as in "%2$d", then the value to convert is not taken from the next sequential argument. Instead, it is taken from the argument indicated by the number, where 1 corresponds to the first arg.如果百分号后跟着一个十进制数字以及美刀字符(这里decimal number不是指小数),那么这时候转换的值不是对应位置的后面的arg而是转换由该十进制数字指定的arg,这里1对应第一个arg。
-----------------------------------------------------------------------------------------------------
分析下列语句:
set par_val [format %0${diff}d$par_val 0]
上述语句中的“%0${diff}d$par_val ”对应“formatString”;而“0”对应于“arg”(即要代入的参数)
注意这句话只有一个百分号,所以只有一个arg,但是这里%后跟了一个数字和美刀字符,这就容易和上述第4点体会混淆,这里的数字是0,注意看回复中的”sencond portion“的描述,所以这里的0(即%后紧跟的这个0)表示被处理的arg数字左边补”0“,具体要补多少个由”third portion“来决定(即${diff}),也就是转换的位宽;后面的d就是转换格式。
所以最终给par_val的赋值由两部分组成:
1、$par_val指定的值(这句话之前有赋值);
2、参数转换,即参数转换成${diff}指定位宽的数值,假如${diff}=29,那么这里就是把0转换成29bit的0,即”00000000000000000000000000000“
那么最终给par_val的赋值就变成(这里假定par_val的初始值为5):
00000000000000000000000000000101