Как выйти из кавычек в оболочке?

Создайте a Makefile как это.

ifneq ($(KERNELRELEASE),)
obj-m   := mymodule.o
else
KDIR    := /lib/modules/$(shell uname -r)/build
PWD     := $(shell pwd)
all:
        $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
install:
        $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules_install
%:
        $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) $@
endif

Принятие источника Вашего модуля находится в mymodule.c, выполнение make создаст mymodule.ko.

75
11.11.2018, 14:59
5 ответов

Можно использовать следующий синтаксис строкового литерала:

> echo $'\'single quote phrase\' "double quote phrase"'
'single quote phrase' "double quote phrase"

От man bash

Слова $ формы 'строка' рассматривают особенно. Слово расширяется до строки с оставленными из обратной косой черты символами, замененными, как указано ANSI C стандарт. Escape-последовательности обратной косой черты, если есть декодируются следующим образом:

          \a     alert (bell)
          \b     backspace
          \e
          \E     an escape character
          \f     form feed
          \n     new line
          \r     carriage return
          \t     horizontal tab
          \v     vertical tab
          \\     backslash
          \'     single quote
          \"     double quote
          \nnn   the eight-bit character whose value is the octal value nnn (one to three digits)
          \xHH   the eight-bit character whose value is the hexadecimal value HH (one or two hex digits)
          \cx    a control-x character
101
27.01.2020, 19:31

В оболочке POSIX принимающей в Вашей строке нет никакой переменной, команды или расширения истории, и нет никакой новой строки, следуйте этим основным предписаниям:

  1. Для заключения в кавычки универсальной строки с одинарными кавычками выполните следующие действия:

    1. Замените любой последовательностью символов неодинарной кавычки с той же последовательностью с добавленным продвижением и запаздывающими одинарными кавычками: 'aaa' ==> ''aaa''

    2. Escape с обратной косой чертой каждый существующий ранее символ одинарной кавычки: ' ==> \'
      В частности, ''aaa'' ==> \''aaa'\'

  2. Для заключения в кавычки универсальной строки с двойными кавычками выполните следующие действия:

    1. Добавьте ведущие и запаздывающие двойные кавычки: aaa ==> "aaa"

    2. Escape с обратной косой чертой каждый символ двойной кавычки и каждый символ обратной косой черты: " ==> \", \ ==> \\

Несколько примеров:

''aaa""bbb''ccc\\ddd''  ==>  \'\''aaa""bbb'\'\''ccc\\ddd'\'\'
                        ==>  "''aaa\"\"bbb''ccc\\\\ddd''"

так, чтобы Вы пример могли быть расширены со следующим:

#!/bin/sh

echo \''aaa'\'' "bbb"'
echo "'aaa' \"bbb\""

sudo su enzotib -c 'echo \'\'\''aaa'\''\'\'\'' "bbb"'\'
sudo su enzotib -c 'echo "'\''aaa'\'' \"bbb\""'

sudo su enzotib -c "echo \\''aaa'\\'' \"bbb\"'"
sudo su enzotib -c "echo \"'aaa' \\\"bbb\\\"\""
12
27.01.2020, 19:31

Простой пример эскапания цитат в оболочке:

$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc

Это сделано путем завершения уже открытого ( »), размещение сбежавших один ( \ '), затем открывать другой ( ').

В качестве альтернативы:

$ echo 'abc'"'"'abc'
abc'abc
$ echo "abc"'"'"abc"
abc"abc

Это сделано путем отделки уже открытого ( ), размещая цитату в другую цитату ( »« »), затем открывать другой ( «).

Связан: Как избежать однозначных кавычек в пределах односмысленных строк? в Stackoverflow SE

17
27.01.2020, 19:31

Принятый ответ работает для простого (одноуровневого) цитирования:

$ echo $'\'single quote phrase\' "double quote phrase"'
'single quote phrase' "double quote phrase"

Чтобы команда, представленная для работы, вам нужно процитировать дважды.
Этот сценарий может выполнять всю работу:

#!/bin/bash

quote () { 
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}

read -r line <<-\_line_to_quote_
'single quote phrase' "double quote phrase"
_line_to_quote_

quote "$line"; echo
quote "echo $(quote "$line")"; echo

Выполните сценарий, чтобы получить:

$ script
''\''single quote phrase'\'' "double quote phrase"'
'echo '\'''\''\'\'''\''single quote phrase'\''\'\'''\'' "double quote phrase"'\'''

Первая строка работает для простого эха:

$ echo ''\''single quote phrase'\'' "double quote phrase"'
'single quote phrase' "double quote phrase"

Вторая строка будет работать для команды, заключенной в двойные кавычки:

sudo su USER -c 'echo '\'''\''\'\'''\''single quote phrase'\''\'\'''\'' "double quote phrase"'\'''
2
27.01.2020, 19:31

Простой

Удалите двойные кавычки, направив вывод вsed

sed 's/"//g'

Пример

somethingThatProducesDoubleQuotesHere | removeDoubleQuotes

Или вы могли бы использовать метод, который облегчит жизнь в будущем

removeDoubleQuotes() {
  sed 's/"//g'
  # EXAMPLES:
  # somethingThatProducesDoubleQuotesHere | removeDoubleQuotes
}
0
26.01.2021, 19:02

Теги

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