Я хочу echo строку, которая может содержать те же параметры как echo. Как я могу это сделать без изменения строки?
Например:
$ var="-e something"
$ echo $var
something
... не печатал -e
Я хочу echo строку, которая может содержать те же параметры как echo. Как я могу это сделать без изменения строки?
Например:
$ var="-e something"
$ echo $var
something
... не печатал -e
Удивительно глубокий вопрос. Поскольку вы отметили bash, я буду считать вы имеете в виду bash внутреннюю команду echo, хотя автономная команда echo GNU coreutils, вероятно, работает достаточно хорошо.
Суть его в том, что если вам действительно нужно использовать echo (что было бы удивительно, но теперь, как вопрос написан сейчас), все зависит от того, что именно может содержать ваша строка.
-e плюс непустая строкаВ этом случае все, что вам нужно сделать, это указать переменную перед тем, как передать ее в echo.
$ var="-e something"
$ echo "$var"
-e something
Если строка не является необязательной опцией или комбинацией echo, которая включает любой суффикс без опции, он не будет распознан как таковой echo и будет распечатан.
-e толькоЕсли ваш случай может уменьшиться до "-e", становится сложнее. Один из способов сделать это:
$ echo -e '\055e'
-e
(выход из тире, поэтому он не интерпретируется как опция, а как восьмеричная последовательность)
Это переписывание строки. Это можно сделать автоматически и без разрушения, поэтому он чувствует себя приемлемым:
$ var="-e something"
$ echo -e ${var/#-/\\055}
-e something
Вы заметили, что я использую опцию -e для интерпретации восьмеричной последовательности, поэтому она не будет работать, если вы намеревались echo -E. Однако он будет работать и для других вариантов.
Серьезно, вы не ограничены echo, не так ли?
printf '%s\n' "$var"
Правильный способ bash - использовать printf:
printf "%s\n" "$var"
Кстати, ваш echo не работал, потому что при запуске:
var="-e something"
echo $var
(без цитирования $var), echo увидит два аргумента: -e и something. Потому что, когда echo встречает -e в качестве своего первого аргумента, он считает его опцией (это также верно для -n и -e), и поэтому обрабатывает его как таковой. Если вы указали var, как показано в других ответах, это сработало бы.
Цитировать:
$ 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
Поскольку мы используем bash, другой альтернативой echo является просто cat a "here string" :
$ var="-e something"
$ cat <<< "$var"
-e something
$ var="-e"
$ cat <<< "$var"
-e
$
printf основанные решения будут почти наверняка более портативными, хотя.
Попробуйте следующее:
$ 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
Вместо этого используйте printf:
var="-e bla"
printf "%s\n" "$var"
Использование только echo "$var" будет по-прежнему терпеть неудачу, если var содержит только -e или подобное. Если вы также должны иметь возможность распечатать это, используйте printf.