Сценарий оболочки выводит эхо-аргументы

В настоящее время я пытаюсь создать сценарий оболочки, который отправляет широковещательные пакеты UDP. Моя проблема в том, что мое эхо выводит аргументы вместо этого, и я понятия не имею, почему. Вот мой сценарий:

#!/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.

Спасибо!

2 ответа

echo реализации безнадежно противоречивы относительно того, принимают ли они параметры команды (например, -ne) или просто обрабатывать их как часть строки для печати и / или интерпретировать ли они escape-последовательности в строках для печати. Похоже, вы видите разницу между встроенной версией Bash echo против (я предполагаю) версии в / bin / echo. Я также видел, что это меняется даже между разными версиями Bash.

Если вы хотите последовательного поведения для чего-нибудь нетривиального, используйте printf вместо echo, Правильнее использовать его немного сложнее, но IMO того стоит, потому что ваши скрипты не будут случайно ломаться, потому что echo изменилось по любой причине. Хитрая вещь о printf является то, что первый аргумент является специальным - это строка формата, в которой интерпретируются все escape-последовательности, и любой % Последовательности говорят, как добавить остальные аргументы. Кроме того, он не добавляет перевод строки в конце, если вы специально не указали это. В этом случае вы можете просто дать ему шестнадцатеричные коды в строке формата:

printf "$var1" | socat - UDP4-DATAGRAM:255.255.255.255:5050,broadcast
printf "$var2" | socat - UDP4-DATAGRAM:255.255.255.255:5050,broadcast

Я понял свою проблему. Оказывается, я запустил свой скрипт с sh ./script.sh вместо bash ./script.sh

Другие вопросы по тегам