Bash: эхо-строка, начинающаяся с "-"

VAR="-e xyz"
echo $VAR

По какой-то причине печатает "xyz". Кажется, я не могу найти способ получить строку, начиная с -e.

Что здесь происходит?

Ответы

Ответ 1

Переменная VAR содержит -e xyz, если вы обращаетесь к переменной через $, -e интерпретируется как опция командной строки для эха. Обратите внимание, что содержимое $VAR автоматически не включается в "".

Используйте эхо "$ VAR", чтобы исправить вашу проблему.

Ответ 2

Ответы, которые говорят, что put $VAR в кавычках верны только побочным эффектом. То есть, если положить в кавычки, echo(1) получает один аргумент -e xyz, и поскольку это не допустимая строка параметра, echo просто распечатывает его. Это побочный эффект, так как echo может так же легко распечатать ошибку в отношении неправильных параметров. Большинство программ сделают это, но, похоже, GNU echo (от coreutils) и версия, встроенная в bash, просто эхо-строки, которые начинаются с дефиса, но не являются допустимыми строками аргументов. Это поведение не документируется, поэтому на него нельзя положиться.

Кроме того, если $VAR содержит допустимый аргумент параметра echo, то цитирование $VAR не поможет:

$ VAR="-e"
$ echo "$VAR"

$

Большинство программ GNU принимают -- как аргумент, чтобы означать, что больше нет обработки параметров - все аргументы после -- должны обрабатываться как необязательные аргументы. bash echo не поддерживает это, поэтому вы не можете его использовать. Даже если бы это было так, это не было бы портативным. echo имеет другие проблемы с переносимостью (-n vs \c, no -e).

Правильное и портативное решение - использовать printf(1).

printf "%s\n" "$VAR"

Ответ 3

Try:

echo "$VAR"

вместо.

(-e является допустимым вариантом для echo - вот что вызывает это явление).

Ответ 4

-e интерпретируется bash как аргумент для эха. Попробуйте

echo "$VAR"