Как эхо "-e"?

Я хочу echo строку, которая может содержать те же параметры как echo. Как я могу это сделать без изменения строки?

Например:

$ var="-e something"
$ echo $var
something

... не печатал -e

Ответ 1

Удивительно глубокий вопрос. Поскольку вы отметили , я буду считать вы имеете в виду bash внутреннюю команду echo, хотя автономная команда echo GNU coreutils, вероятно, работает достаточно хорошо.

Суть его в том, что если вам действительно нужно использовать echo (что было бы удивительно, но теперь, как вопрос написан сейчас), все зависит от того, что именно может содержать ваша строка.

Простой случай: -e плюс непустая строка

В этом случае все, что вам нужно сделать, это указать переменную перед тем, как передать ее в echo.

$ var="-e something"
$ echo "$var"
-e something

Если строка не является необязательной опцией или комбинацией echo, которая включает любой суффикс без опции, он не будет распознан как таковой echo и будет распечатан.

Harder: строка может быть -e только

Если ваш случай может уменьшиться до "-e", становится сложнее. Один из способов сделать это:

$ echo -e '\055e'
-e

(выход из тире, поэтому он не интерпретируется как опция, а как восьмеричная последовательность)

Это переписывание строки. Это можно сделать автоматически и без разрушения, поэтому он чувствует себя приемлемым:

$ var="-e something"
$ echo -e ${var/#-/\\055}
-e something

Вы заметили, что я использую опцию -e для интерпретации восьмеричной последовательности, поэтому она не будет работать, если вы намеревались echo -E. Однако он будет работать и для других вариантов.

Правильный путь

Серьезно, вы не ограничены echo, не так ли?

printf '%s\n' "$var"

Ответ 2

Правильный способ bash - использовать printf:

printf "%s\n" "$var"

Кстати, ваш echo не работал, потому что при запуске:

var="-e something"
echo $var

(без цитирования $var), echo увидит два аргумента: -e и something. Потому что, когда echo встречает -e в качестве своего первого аргумента, он считает его опцией (это также верно для -n и -e), и поэтому обрабатывает его как таковой. Если вы указали var, как показано в других ответах, это сработало бы.

Ответ 3

Цитировать:

$ var="-e something"
$ echo "$var"
-e something

Если вы хотите получить поведение echo -e (включить интерпретацию escape-кодов с обратной косой чертой), вам нужно оставить ссылку $var без кавычек:

$ var="hi\nho"
$ echo $var
hi
ho

Или используйте eval:

$ var="hi\nho"
$ eval echo \${var}
hi\nho

$ var="-e hi\nho"
$ eval echo \${var}
hi
ho

Ответ 4

Поскольку мы используем bash, другой альтернативой echo является просто cat a "here string" :

$ var="-e something"
$ cat <<< "$var"
-e something
$ var="-e"
$ cat <<< "$var"
-e
$ 

printf основанные решения будут почти наверняка более портативными, хотя.

Ответ 5

Попробуйте следующее:

$ env POSIXLY_CORRECT=1 echo -e
-e

Из-за псевдонимов оболочки и встроенной команды echo, используя незакрашенные echo в интерактивном режиме или в script может получить различную функциональность чем описано здесь. Вызовите его через env (т.е. env echo ...) чтобы избежать помех от оболочки.

Была введена переменная среды POSIXLY_CORRECT, позволяющая пользователю принудительно выполнять поведение, совместимое со стандартами. Смотрите: POSIX в Википедии.

Или используйте printf:

$ printf '%s\n' "$var"

Источник Почему bash проглатывание -e перед массивом в stackoverflow SE

Ответ 6

Вместо этого используйте printf:

var="-e bla"
printf "%s\n" "$var"

Использование только echo "$var" будет по-прежнему терпеть неудачу, если var содержит только -e или подобное. Если вы также должны иметь возможность распечатать это, используйте printf.