Bash: эхо-строка, начинающаяся с "-" - PullRequest
21 голосов
/ 06 сентября 2010
VAR="-e xyz"
echo $VAR

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

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

Ответы [ 4 ]

44 голосов
/ 07 сентября 2010

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

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

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

$

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

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

printf "%s\n" "$VAR"
5 голосов
/ 06 сентября 2010

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

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

2 голосов
/ 06 сентября 2010

Попробуйте:

echo "$VAR"

вместо.

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

0 голосов
/ 06 сентября 2010

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

echo "$VAR"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...