Как я могу передать строку без кавычек с пробелами в качестве аргумента в кавычках?

Лучше объяснить на примере. Я пишу простую оболочку (функция в моем .bashrc) вокруг почтовой команды.

Вот моя текущая функция, которая работает неправильно:

function email_me() { echo "$@" | mail -s "\"$@\"" [email protected]; }

Вот мое желаемое использование - это отправит электронное письмо с темой и телом, установленным на testing 1 2 3. Обратите внимание, что я специально не хочу ставить кавычки вручную.

~$ email_me testing 1 2 3

Таким образом, я хочу, чтобы замена строки происходила следующим образом:

echo "testing 1 2 3" | mail -s "testing 1 2 3" [email protected]

Однако, что бы я ни пытался, аргумент -s не заключен в кавычки, и электронное письмо с темой "testing отправляется следующим получателям: 1, 2, 3 и [email protected].

Как я могу заставить аргумент -s считать «тестирование 1 2 3» одной строкой?


person Jer    schedule 18.11.2015    source источник
comment
Немного о том, почему ваш подход "\"$@\"" не работает: $@ в двойных кавычках расширяется до "$1" "$2"... с разделенными словами, а \" — буквальная кавычка, так что в итоге вы получите "\"$1" в качестве первого слова, "$2" в качестве второго слова, ... "$N\"" в качестве последнего слова. Прочтите gnu.org/software/bash/manual/bash.html. для получения подробной информации о расширении.   -  person 4ae1e1    schedule 18.11.2015
comment
Да, просто пытаюсь сделать очень простой отправку себе однострочного электронного письма из командной строки. И спасибо за предложение эха; это работает отлично!   -  person Jer    schedule 19.11.2015
comment
@ 4ae1e1 Не стесняйтесь добавлять эхо-версию в качестве ответа, и я приму ее.   -  person Jer    schedule 19.11.2015
comment
Замените $@ на $*, и ваша функция должна работать как положено. Не нужно для экранированных кавычек \"   -  person alvits    schedule 19.11.2015
comment
Комментарий выше правильный (при условии, что первый символ IFS является пробелом). Я временно был в замешательстве.   -  person 4ae1e1    schedule 19.11.2015
comment
Попробуйте это function email_me() { echo "$@" | mail -s "$*" [email protected]; }   -  person alvits    schedule 19.11.2015
comment
Если вы не знаете, что ваше сообщение электронной почты никогда не будет содержать ничего, что оболочка попытается расширить, прежде чем передать его вашей функции, вам гораздо лучше просто смириться с вводом кавычек.   -  person chepner    schedule 19.11.2015


Ответы (1)


я бы предложил использовать

function email_me() { printf %s\\n "$*" | mail -s "$*" [email protected]; }
  • "$*" действительно является специальной переменной, содержащей все аргументы вместе в одной строке
  • использование printf вместо echo избавляет вас от неожиданностей с -n -e и всем, что поддерживает ваша реализация echo.

Тем не менее, будут ситуации, когда вам придется заключать аргументы в email_me, чтобы избежать подстановки и сохранить пробелы:

email_me 2 * 2 = 4
[sends you all file names in current directory]
email_me a   b
[sends "a b" with only one space]
person Dmitry Grigoryev    schedule 18.11.2015