Это почти наверняка возврат каретки. echo
выполняет свою работу правильно и испускает строку на ваш терминал; проблема заключается в том, что ваш терминал обрабатывает часть строки в качестве команды для ее последующего (в частности, LF-символ, $'\r'
, сообщая ему отправить курсор в начало существующей строки).
Если вы хотите видеть содержимое $test
способом, который не позволяет вашему терминалу интерпретировать escape-последовательности или другие управляющие символы, запустите следующее (обратите внимание, что строка формата %q
является расширением bash, недоступным в чисто POSIX система):
printf '%q\n' "$test"
Это покажет вам точное содержание отформатированного и спаслось для использования оболочки, которая будет поучительной, почему они являются проблематичными.
Чтобы удалить $'\r'
, который почти наверняка персонаж дает вам неприятности, вы можете запустить следующее разложение параметра:
test=${test//$'\r'/}
В отличие от решений, требующих трубопроводов запуск дополнительного процесса (например, tr
), это происходит внутри уже запущенная оболочка bash и, следовательно, более эффективна.
Я подозреваю, что в '$ test' могут быть некоторые невидимые символы, такие как возврат каретки, что заставляет' -J DROP' делать резервную копию и перезаписывать 'iptables' на выходе. Другими словами, строка «187.12/14», вероятно, что-то вроде «\ r187.12.14» или что-то в этом роде. – lurker
@devnull - не имеет отношения к | - Я думаю, что mbratch верна. –
@JimHolland. Форматирование вызвало обратные шаги (подмена команды) как _invisible_. Мне показалось, что вы используете команду с '|' как переменную. – devnull