Можете ли вы помочь мне понять это объяснение цитирования оболочки?

Я пытаюсь понять и воспроизвести это

Я прочитал этот раздел в книге « Изучение оболочки Баша» ;
Мой вопрос об этом ниже:

«Обратите внимание, что мы использовали двойные кавычки вокруг переменных (и строк, содержащих их) в этих примерах эха. В главе 1 мы сказали, что некоторые специальные символы внутри двойных кавычек все еще интерпретируются, а ни одна из них не интерпретируется внутри одинарных кавычек.

Особым символом, который «выживает» в двойных кавычках, является знак доллара, означающий, что переменные оцениваются. В некоторых случаях можно обойтись без двойных кавычек; например, мы могли бы написать вышеупомянутую команду эхо таким образом:

$ echo The value of \$ varname is \"$ varname \". 

Но двойные кавычки более правильны. Вот почему. Предположим, что мы сделали это:

 $ fred='Four spaces between these words.' 

Тогда, если мы ввели команду # echo $ fred, результат будет:

 Four spaces between these words. 

Что случилось с дополнительными пространствами? Без двойных кавычек оболочка разбивает строку на слова после подстановки значения переменной, как это обычно бывает при обработке команд. Двойные кавычки обходят эту часть процесса (заставляя оболочку думать, что вся цитированная строка – это одно слово).

Поэтому команда echo «$ fred» печатает это:

 Four spaces between these words. 

Различие между одиночными и двойными кавычками становится особенно важным, когда мы начинаем иметь дело с переменными, которые содержат информацию о пользователе или файле позже ».

Мой вопрос

Я пытался практиковать с этим, но я смущен. Я полагаю,

 $ echo The value of \$ varname is \"$ varname \". $ fred='Four spaces between these words.' 

в файле? Например, введите # nano, затем введите его там? Или я просто ввожу его в терминал? Ни то, ни другое не работает. Когда я ввел # nano fred и поместил его в этот файл и сделал его исполняемым и изменил «varname» на «fred» и запустил ./fred, я получил это как результат:

 The value of $fred is "" 

Можете ли вы объяснить, что я делаю неправильно?

Я попытался немного разбить это для вас, используя ваши собственные примеры / текст, проверьте его:

 $ cat fred #!/bin/bash fred='Four spaces between these words.' echo "The value of \$fred is $fred" echo "The next line being printed is simply the results of # echo \$fred" echo $fred 

Запуск сценария bash выше выводит на терминал / stdout следующее:

 The value of $fred is Four spaces between these words. The next line being printed is simply the results of # echo $fred Four spaces between these words. 

Кроме того, вы можете посмотреть видео с терминала здесь: http://showterm.io/98f56243f60551b338b9f

Я думаю, вы должны поставить:

 fred='Four spaces between these words' echo "The value of \$fred is \"$fred\"" 

Вы можете ввести это в терминал, щелкнув правой кнопкой мыши и выбрав «Вставить», или « Ctrl + Shift + ), или введя его по одной строке за раз. например:
введите описание изображения здесь

Вы также можете создать скрипт с этим nano ./echofredscript и вставить в:

 #!/bin/bash #The bit above is a shebang line (look it up on wikipedia). #These are comments and will be ignored fred='Four spaces between these words' echo "The value of \$fred is \"$fred\"" 

Затем вы можете сохранить его с помощью Ctrl + O и выйти с помощью Ctrl + X , а затем запустить его, чтобы сделать его исполняемым:

 chmod +x ./echofredscript 

Затем это для запуска скрипта:

 ./echofredscript 

Это должно привести к: введите описание изображения здесь

Заметки:

  1. Нет пробелов между $ и именем переменной (например, $varname not $ varname )
  2. Символ \ указывает оболочке обрабатывать следующий символ как обычный символ. В этом случае вам нужно избежать котировок вокруг переменной, чтобы они отображались на выходе, и первая переменная, поэтому она выглядит как $fred не Four spaces between these words .

Это может также работать, поэтому вам не нужно скрывать кавычки, но вам все равно нужно избежать этой переменной:

 echo "The value of \$fred is '$fred'".