Экранирование двойных кавычек внутри подстановки команд

Другое решение awk:

awk '{l=length($1); print substr($1,1,1) l-2 substr($1,l,1)}'
  • l=length($1)-Задайте для переменной lдлину вашей строки (Предполагая, что входная строка находится в первом столбце и не содержит пробелов)
  • substr($1,1,1)-(столбец #, начальная точка, конечная точка ), поэтому напечатайте столбец 1, начиная с позиции 1, и напечатайте 1 символ.
  • l-2-Длина строки минус 2
  • substr($1,l,1)-Напечатать столбец 1, начиная с позиции l(, длину строки )и напечатать 1 символ.
1
18.09.2020, 01:00
2 ответа

Это Разбиение слов в действии. Прежде чем мы начнем, просмотрите Расширения оболочки , обращая внимание на порядок, в котором они выполняются.

Глядя наnode -p "console.log($(echo \"hello world\"))"

  • расширение скобки? нет

  • расширение тильды? нет

  • расширение параметра? здесь нет

  • подмена команды? да, оставив тебя с

      node -p "console.log("hello world")"
    
  • арифметическое расширение? нет

  • замена процесса? нет

  • разбиение на слова? аргумент -pв кавычках, так что нет.

  • расширение имени файла? нет

  • удаление кавычек выполнено

bash порождает node, передавая ему 2 аргумента, -pиconsole.log("hello world")


Теперь посмотрите наnode -p console.log($(echo \"hello world\"))

  • после подстановки команд имеемnode -p console.log("hello world")

  • когда мы доходим до разделения слов, аргумент -pне имеет кавычек для его защиты. Для текущей команды bash имеет 4 токена:

      node -p console.log("hello world")
      ^^^^ ^^ ^^^^^^^^^^^^^^^^^^ ^^^^^^^
    

bash порождает nodeпередает его 3 аргумента :-p, console.log("helloиworld")--console.log("helloявно является синтаксической ошибкой javascript, и вы видите, что происходит.


Более подробно см. Последствия для безопасности, если забыли заключить переменную в кавычки в оболочках bash/POSIX

3
18.03.2021, 23:04

Я не знаю, что должен делать "узел -p" в вашем примере. Но попытка воспроизвести ваш пример приводит к следующему:

[user@c0n1 ~]# echo "hello world"
hello world
[user@c0n1 ~]# echo $(\"hello world\")
-bash: "hello: command not found

Пробел в последнем примере разрывает строку внутри кавычек, и bash считает, что «hello» — это команда. Защита пробела обратной косой чертой подтверждает это объяснение:

[user@c0n1 ~]# echo $(\"hello\ world\")
-bash: "hello world": command not found

Если вы пытаетесь создать строку внутри подстановки команд, вам нужна команда для ее выполнения, например:

[user@c0n1 ~]# echo $(echo \"hello world\")
"hello world"
0
18.03.2021, 23:04

Теги

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