В чем разница между echo `date`, echo" date "и echo '' date`?

В чем разница между этими тремя командами?

echo `date` echo "`date`" echo '`date`' 

Я смущен тем, каковы различия на самом деле. Я думаю, что когда «вокруг» означает, что это строка, поэтому эхо буквально выводит date строки вместо отображения даты?

4 Solutions collect form web for “В чем разница между echo `date`, echo" date "и echo '' date`?”

`date` просто вернет выход команды date . Тем не менее, он удаляет лишние символы в местах, где на выходе имеется более одного символа пробела.

В «дате» двойные кавычки являются слабыми кавычками, поэтому они будут расширять переменные (попробуйте «$ PWD») и выполнить подстановку команд.

В «дате» одиночные кавычки являются более сильными кавычками, поэтому они не позволят расширять переменные или подмену команд внутри них.

Дополнительную информацию см. В этой ссылке .

Отредактировал первую точку, как правильно указал Майкл Сульманн в комментарии ниже .

И то и другое

 echo `date` 

а также

 echo "`date`" 

отобразит дату. Вывод из последнего выглядит как результат исходящей date сам по себе.

Однако есть разница: тот, который окружен " кавычками " будет отправлен на echo в качестве одного аргумента. Кавычки инкапсулируют вывод всей команды в качестве одного аргумента. Поскольку echo просто печатает свои аргументы по порядку, с пробелами между ними, он будет в основном выглядеть одинаково.

Вот пример тонкой разницы:

 echo `date` 

производит:

 Fri Nov 1 01:48:45 EST 2013 

но:

 echo "`date`" 

производит:

 Fri Nov 1 01:48:49 EST 2013 

Обратите внимание, что два пространства после Nov были сокращены до единицы без кавычек. Это происходит из-за того, что оболочка анализирует каждый элемент, разделенный пробелом, и отправляет результат для эха в качестве 6 аргументов. Когда вы его цитируете, echo получает один единственный аргумент, а кавычки сохраняют пробел.

Это становится гораздо более важным в командах, отличных от эха. Например, представьте себе команду foo которая хочет два аргумента: дату и адрес электронной почты.

Это будет работать в этом сценарии:

 foo "`date`" joeuser@example.com 

Но это смущает скрипт, отправив ему 7 аргументов:

 foo `date` joeuser@example.com 

В оболочках POSIX `date` является древней формой подстановки команд. Современный синтаксис – $(date) .

В обоих случаях они расширяются до вывода date с отключенными символами завершающей строки (при условии, что вывод не содержит символов NUL).

Однако, если не в двойных кавычках и в контекстах списка (например, в аргументах для простых команд, таких как echo в вашем случае), это расширение дополнительно подчиняется:

  1. Разделение слов : это «вывод date с утерянными символами завершающей строки» разделен в соответствии с текущим значением переменной $IFS (по умолчанию содержит пробел, табуляцию и новую строку (и NUL с zsh )) на несколько слов .

    Например, если date выдает Fri 1 Nov 14:11:15 GMT 2013\n (как это часто бывает в английском языке и в часовом поясе в материковой части Великобритании), и в настоящее время $IFS содержит : который будет разделен на 3 слова : Fri 1 Nov 14 , 11 и 15 GMT 2013 .

  2. Генерация имени файла (например, globbing ) (за исключением zsh ): то есть каждое слово, полученное в результате разбиения выше, ищет подстановочные символы ( * , ? , [...] хотя некоторые оболочки имеют больше) и расширены до списка имена файлов, которые соответствуют этим шаблонам. Например, если выход date равен ?%? 33 */*/* UVC 3432 ?%? 33 */*/* UVC 3432 (как это часто бывает в локациях Венеры и в часовом поясе UVC), а $IFS – значение по умолчанию), затем это расширение распространяется на все не скрытые 3 символа имени файла в текущем каталоге, средний символ которого % , 33 , все не скрытые файлы во всех не скрытых подкаталогах всех не скрытых подкаталогов текущего каталога, UVC и 3432 .

Поэтому:

  1. Вы всегда должны указывать (с двойными кавычками) замены команд, если вы не хотите, чтобы расщепление слова или генерация имени файла выполнялись при его расширении
  2. Если вы хотите разделить слова , тогда вы должны установить $IFS для символов, которые хотите разбить.
  3. Если вы хотите разделить слово, но не генерировать имя файла , вам нужно выдать set +f чтобы отключить его.

Одиночные цитаты цитируют все так, чтобы заставить обратных символов воспринимать буквально.

Пример (использование -x упрощает просмотр происходящего):

 $ bash --norc -x bash-4.2$ IFS=: + IFS=: bash-4.2$ echo `date` ++ date + echo 'Fri 1 Nov 14' 42 '33 GMT 2013' Fri 1 Nov 14 42 33 GMT 2013 bash-4.2$ echo "`date`" ++ date + echo 'Fri 1 Nov 14:42:41 GMT 2013' Fri 1 Nov 14:42:41 GMT 2013 bash-4.2$ cd /lib/modules + cd /lib/modules bash-4.2$ export TZ=UVC LC_ALL=vs_VS + export TZ=UVC LC_ALL=vs_VS + TZ=UVC + LC_ALL=vs_VS bash-4.2$ unset -v IFS # get the default behaviour + unset -v IFS bash-4.2$ echo `date` ++ date + echo '?%?' 33 3.10-2-amd64/build/arch 3.10-2-amd64/build/include 3.10-2-amd64/build/Makefile 3.10-2-amd64/build/Module.symvers 3.10-2-amd64/build/scripts 3.10-2-amd64/kernel/arch 3.10-2-amd64/kernel/crypto 3.10-2-amd64/kernel/drivers 3.10-2-amd64/kernel/fs 3.10-2-amd64/kernel/lib 3.10-2-amd64/kernel/mm 3.10-2-amd64/kernel/net 3.10-2-amd64/kernel/sound 3.10-2-amd64/source/arch 3.10-2-amd64/source/include 3.10-2-amd64/source/Makefile 3.10-2-amd64/source/scripts 3.10-2-amd64/updates/dkms 3.10-3-amd64/build/arch 3.10-3-amd64/build/include 3.10-3-amd64/build/Makefile 3.10-3-amd64/build/Module.symvers 3.10-3-amd64/build/scripts 3.10-3-amd64/kernel/arch 3.10-3-amd64/kernel/crypto 3.10-3-amd64/kernel/drivers 3.10-3-amd64/kernel/fs 3.10-3-amd64/kernel/lib 3.10-3-amd64/kernel/mm 3.10-3-amd64/kernel/net 3.10-3-amd64/kernel/sound 3.10-3-amd64/source/arch 3.10-3-amd64/source/include 3.10-3-amd64/source/Makefile 3.10-3-amd64/source/scripts 3.10-3-amd64/updates/dkms UVC 3432 ?%? 33 3.10-2-amd64/build/arch 3.10-2-amd64/build/include 3.10-2-amd64/build/Makefile 3.10-2-amd64/build/Module.symvers 3.10-2-amd64/build/scripts 3.10-2-amd64/kernel/arch 3.10-2-amd64/kernel/crypto 3.10-2-amd64/kernel/drivers 3.10-2-amd64/kernel/fs 3.10-2-amd64/kernel/lib 3.10-2-amd64/kernel/mm 3.10-2-amd64/kernel/net 3.10-2-amd64/kernel/sound 3.10-2-amd64/source/arch 3.10-2-amd64/source/include 3.10-2-amd64/source/Makefile 3.10-2-amd64/source/scripts 3.10-2-amd64/updates/dkms 3.10-3-amd64/build/arch 3.10-3-amd64/build/include 3.10-3-amd64/build/Makefile 3.10-3-amd64/build/Module.symvers 3.10-3-amd64/build/scripts 3.10-3-amd64/kernel/arch 3.10-3-amd64/kernel/crypto 3.10-3-amd64/kernel/drivers 3.10-3-amd64/kernel/fs 3.10-3-amd64/kernel/lib 3.10-3-amd64/kernel/mm 3.10-3-amd64/kernel/net 3.10-3-amd64/kernel/sound 3.10-3-amd64/source/arch 3.10-3-amd64/source/include 3.10-3-amd64/source/Makefile 3.10-3-amd64/source/scripts 3.10-3-amd64/updates/dkms UVC 3432 bash-4.2$ echo "`date`" ++ date + echo '?%? 33 */*/* UVC 3432' ?%? 33 */*/* UVC 3432 

Если вывод содержит символы NUL, тогда поведение изменяется от оболочки к оболочке: некоторые удаляют их, некоторые обрезают вывод с первым символом NUL, zsh сохраняет их, но замечает, что в любом случае внешние команды не могут принимать аргументы, содержащие NUL

С `date` вы получаете результат разделения даты на несколько слов, потому что разделение слов выполняется после подстановки команды.

С «date» вы получаете выход даты как одно слово / параметр, так как есть замена команд между двойными кавычками, но результат не анализируется дальше. То же самое справедливо с переменным расширением типа «$ i» в моем примере ниже.

С «датой» вы получаете буквенную «дату», так как нет никакой подстановки команд между одинарными кавычками.

Возможно, различия в 3-х формах будут более заметными:

 > for i in `date`; do echo "$i"; done Fr 1. Nov 12:25:30 CET 2013 > for i in "`date`"; do echo "$i"; done Fr 1. Nov 12:25:38 CET 2013 > for i in '`date`'; do echo "$i"; done `date` 
  • Ubuntu unattended install: echo keypress to dialog
  • Использование разделителя табуляции в срезе в Unix Shell Scripting
  • Вернуться к спине Трубы в команду
  • эхо-файл в виде отдельной строки с \ n
  • Выбирайте только каталоги и порядок с помощью эха
  • как `echo` 'отформатировал' man-страницу некоторой команды в текстовый файл
  • trap echo делает печать не записывать в консоль при записи в файл
  • Как эхо анализирует $ 100?
  • Что означает echo -e \ e - как побег?
  • Как эхо выражение с одинарными и двойными кавычками?
  • Невозможно использовать параметр echo в файле сценария оболочки
  • Linux и Unix - лучшая ОС в мире.