我有一条命令
for i in {1..9} ; do cansend slcan0 "7e0#02090"$i"0000000000"
我如何发送相同的命令,但是对于$ i,则发送4个字节的十六进制。有点像蛮力?
答案 0 :(得分:0)
您可以将printf
utility和%04x
用作格式说明符(0
填充,4
个字符,格式为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
答案 1 :(得分:0)
您可以使用括号扩展来生成所有4字节十六进制代码序列(00000000
,00000001
,00000002
,...,{{ 1}})。
FFFFFFFF
生成列表{{0..9},{A..F}}
。
0 1 2 … F
生成列表{{0..9},{A..F}}{{0..9},{A..F}}
。
依此类推。
对于4个字节,您必须重复00 0 02 … FF
8次,因为每个字节都有两个十六进制数字。
{{0..9},{A..F}}
虽然这种方法可能适用于两位数或三位数,但我强烈建议不要在这种情况下使用它。上面的脚本不可读且非常慢。
bash的下一个更好的选择是……
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
…但是请记住,这比从(例如)python程序发送序列的时间幅值要慢,该程序无需每次都要发送新内容时都需要启动新进程到slccan0。