Сценарий оболочки выводит эхо-аргументы
В настоящее время я пытаюсь создать сценарий оболочки, который отправляет широковещательные пакеты 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