我有一个命令
for i in {1..9} ; do cansend slcan0 "7e0#02090"$i"0000000000"
我如何发送相同的命令,但 $i 发送 4 个字节的 HEX。有点像蛮力?
您可以使用该printf
实用程序并%04x
作为格式说明符(0
pad、4
characters、format as he x
):
for i in {1..9}; do
command=$(printf "7e0#02090%04x0000000000" $i)
echo cansend slcan0 "$command" # remove `echo` here :)
done
打印出来
cansend slcan0 7e0#0209000010000000000
cansend slcan0 7e0#0209000020000000000
cansend slcan0 7e0#0209000030000000000
cansend slcan0 7e0#0209000040000000000
cansend slcan0 7e0#0209000050000000000
cansend slcan0 7e0#0209000060000000000
cansend slcan0 7e0#0209000070000000000
cansend slcan0 7e0#0209000080000000000
cansend slcan0 7e0#0209000090000000000
您可以使用大括号扩展来生成所有 4 字节十六进制代码序列(00000000
, 00000001
, 00000002
, ..., FFFFFFFF
)的列表。
{{0..9},{A..F}}
生成列表0 1 2 … F
。
{{0..9},{A..F}}{{0..9},{A..F}}
生成列表00 0 02 … FF
。
等等。
对于 4 个字节,您必须重复{{0..9},{A..F}}
8 次,因为每个字节都有两个十六进制数字。
for i in {{0..9},{A..F}}{{0..9},{A..F}}{{0..9},{A..F}}{{0..9},{A..F}}{{0..9},{A..F}}{{0..9},{A..F}}{{0..9},{A..F}}{{0..9},{A..F}}; do
cansend slcan0 "7e0#02090${i}0000000000"
done
虽然这种方法对于两位或三位数字可能是可行的,但我强烈建议不要在这种情况下使用它。上面的脚本不可读而且很慢。
bash 中的下一个更好的事情是……</p>
bytes=4
((max=2**(bytes*8)-1))
for ((i=0; i<max; i++)); do
printf -v hex %08x "$i"
cansend slcan0 "7e0#02090${hex}0000000000"
done
...但请记住,这将比从(例如)python 程序发送序列慢得多,因为每次您想向slccan0发送内容时,它都不必启动新进程。