Я хочу 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
.