Понимание обратной галочки (')

Вы могли изменить первый файл на:

s/username/joe/
s/password/secret/
s/database/c2duo_db/g

сохраните его как db.sed и назовите его с

sed -f db.sed mysqlbackup.sh > joeSqlbackup.sh

Для различных пользователей/паролей и баз данных Вы генерировали бы различные sed-сценарии.

37
13.04.2017, 15:37
3 ответа

Текст между обратными галочками выполняется и заменяется выводом команды (минус запаздывающие символы новой строки, и остерегайтесь той оболочки, поведения варьируются, когда существуют символы NUL в выводе). Это называют заменой команды, потому что ею заменяют с выводом команды. Таким образом, если Вы хотите распечатать 5, Вы не можете использовать обратные галочки, можно использовать кавычки, как echo "$b" или просто отбросьте любую цитату и использование echo $b.

Как Вы видите с тех пор $b содержит 5, при использовании обратных галочек bash пробует к команде выполнения 5 и с тех пор нет такой команды, это перестало работать с сообщением об ошибке.

Чтобы понять как работы обратных галочек, попытайтесь выполнить это:

$ A=`cat /etc/passwd | head -n1`
$ echo "$A"

cat /etc/passwd |head -n1 должен распечатать первую строку /etc/passwd файл. Но так как мы используем обратные галочки, это не печатает это на консоли. Вместо этого это хранится в A переменная. Можно отозваться эхом $A к этому. Обратите внимание, что более эффективный способ распечатать первую строку использует команду head -n1 /etc/passwd но я хотел указать, что выражение в обратных галочках не должно быть простым.

Таким образом, если первая строка/etc/passwd root:x:0:0:root:/root:/bin/bash, первой командой динамично заменит удар на A="root:x:0:0:root:/root:/bin/bash".

Обратите внимание, что этот синтаксис имеет Оболочку Bourne. Заключение в кавычки и выход становятся быстро кошмаром с ним особенно при запуске вложения их. Ksh, представленный $(...) альтернатива, которая теперь стандартизируется (POSIX) и поддерживается всеми оболочками (даже Оболочка Bourne от Unix v9). Таким образом, необходимо использовать $(...) вместо этого в наше время, если Вы не должны быть портативными к очень старым Оболочкам Bourne.

Также обратите внимание что вывод `...` и $(...) подвергаются разделению слова и поколению имени файла точно так же, как переменное расширение (в zsh, слово, разделяющее только), так должен был бы обычно заключаться в кавычки в контекстах списка.

54
27.01.2020, 19:36
  • 1
    Привет @Krzysztof, который полезен! "так как $b содержит 5, удар пробует к команде выполнения 5", точно, что я искал –  coolcric 17.09.2012, 14:58
  • 2
    you can use quotation marks, like echo "$b" => делает, "" делают что-либо специальное? Это кажется echo $b работал бы точно также. –  Tootsie Rolls 08.07.2013, 01:01
  • 3
    @Anita: В общих кавычках делает некоторые специальные вещи (это изменяет способ, которым специальные символы рассматривают - особенно пробелы), но в этом случае, они могут быть отброшены без очень проблем. Это вызвано тем, что никакие специальные символы не используются и echo команда не заботится о количестве аргументов, которые это получает так если b имеет некоторые пробелы внутри, это получит несколько аргументов и все еще распечатает их. Это может не иметь место для других команд (особенно, когда переменная не установлена), таким образом, я склонен всегда окружать переменные кавычками. –  Krzysztof Adamski 08.07.2013, 09:59
  • 4
    был бы хорош если (POSIX) была бы ссылка на фактический стандарт. поблагодарите Вас –  erikbwork 22.05.2015, 14:38
  • 5
    @erikb85: Это примечание не было добавлено мной, но я отредактировал его со ссылкой, поскольку Вы предложили :) –  Krzysztof Adamski 22.05.2015, 15:09

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

То, что Вы хотите сделать, просто:

$ b=5; echo $b

Для понимания обратных галочек лучше сравните:

$ b=5; a=`echo $b`; echo $a
  5
11
27.01.2020, 19:36

При движении шаг за шагом строка должна объяснить это.

$ b=5; echo `$b`;
  1. переменная наборов b к 5
  2. оценивает $b (эффективно выполнения 5)
  3. echoes вывод оценки выше.

Таким образом да, вывод, который Вы получили, ожидается. Вы оцениваете содержание переменной, не фактическая команда Вы думали, что были. Все Вы вставляете обратные галочки, просто оценено (runned) в новом (sub) оболочка.

8
27.01.2020, 19:36
  • 1
    привет @gertvdijk, спасибо за Ваше сообщение! Я думал, что 'возвращает то, с чем это оставляют после оценки его содержания. Так, я думал, что '$b' возвратится 5, чтобы эхо распечатало его –  coolcric 17.09.2012, 15:02

Теги

Похожие вопросы