0

我目前正在尝试构建一个发送广播 UDP 数据包的 shell 脚本。我的问题是我的 echo 正在输出参数,我不知道为什么。这是我的脚本:

#!/bin/bash
# Script
var1="\xdd\x02\x00\x13\x00\x00\x00\x10\x46\x44\x30\x30\x37\x33\x45\x31\x39\x39\x45\x43\x31\x42\x39\x34\x00"
var2="\xdd\x00\x0a\x\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x02"

echo -ne $var1 | socat - UDP4-DATAGRAM:255.255.255.255:5050,broadcast
echo -ne $var2 | socat - UDP4-DATAGRAM:255.255.255.255:5050,broadcast

使用wireshark,我可以看到脚本将-ne 打印为字符,并且没有将每个\xHH 转换为相应的ASCII 字符。

谢谢!

4

2 回答 2

0

echo-ne实现对于它们是否采用命令选项(如)或只是将它们视为要打印的字符串的一部分,和/或它们是否解释要打印的字符串中的转义序列,完全不一致。听起来您看到 bash 的内置版本echo与(我猜)/bin/echo 中的版本之间存在差异。我还看到它甚至在不同版本的 bash 之间也有所不同。

如果您希望任何不平凡的事情都具有一致的行为,请使用printf而不是echo. 正确使用它稍微复杂一些,但 IMO 值得这样做,因为您的脚本不会因为echo任何原因而随机中断。棘手的printf是第一个参数是特殊的——它是一个格式字符串,其中解释了所有转义序列,并且任何%序列都告诉它如何添加其余参数。此外,除非您明确告诉它,否则它不会在末尾添加换行符。在这种情况下,您可以只给它格式字符串中的十六进制代码:

printf "$var1" | socat - UDP4-DATAGRAM:255.255.255.255:5050,broadcast
printf "$var2" | socat - UDP4-DATAGRAM:255.255.255.255:5050,broadcast
于 2015-08-02T21:35:34.210 回答
0

我想出了我的问题。原来我是用 sh ./script.sh 而不是 bash ./script.sh 运行我的脚本

于 2015-08-02T14:42:07.997 回答