Одинарная кавычка заменена двойными кавычками

Решение, упомянутое Хауке, было бы одним из путей. Недостаток этого подхода заключается в том, что вы должны держать подключенным (проводной )Ethernet-интерфейс до тех пор, пока все соединения не «выключатся».

Другой, более плавный, но и немного более сложный подход (, например. Я не знаю, можете ли вы добиться этого с помощью NetworkManager, который, согласно вашим метрикам маршрута -, вы используете ), будет использовать соединение для соединения интерфейсов вместе. Таким образом, при отключении вашего проводного подключения к сети Ethernet соединения будут автоматически терпеть неудачу -для использования WiFi.

Я уже дал более подробное объяснение того, как настроить связывание для WiFi и проводных подключений, в своем ответе на Использование порта WiFi в качестве резервного канала .

1
06.01.2020, 18:20
2 ответа

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

p="'123','234','456'"

Двойные кавычки вокруг строки '123','234','456'не позволяют оболочке удалить одинарные кавычки. Без двойных кавычек значением переменной была бы строка 123,234,456. Также обратите внимание, что для присвоения значения переменной pперед именем переменной не должно стоять $.

Теперь вы можете вывести значение вашей переменной в одинарных кавычках, например:

$ printf '%s\n' "$p"
'123','234','456'

Вы также можете вывести его, заменив одинарные кавычки на двойные одинарные кавычки, например:

$ printf '%s\n' "${p//\'/\'\'}"
''123'',''234'',''456''

Или двойные кавычки (это то, что я думал, что вы хотели, прежде чем разметка вашего вопроса была исправлена ​​):

$ printf '%s\n' "${p//\'/\"}"
"123","234","456"

Биты ${p//\'/\'\'}и ${p//\'/\"}'являются примерами замены параметров, которая заменяет все одинарные кавычки на двойные одинарные кавычки или двойные кавычки (соответственно )в значении $p. Общая форма этой замены выглядит как ${variable//pattern/string}.


Когда у вас есть список отдельных вещей, таких как числа 123, 234 и 456, лучше всего хранить их в массиве:

p=( 123 234 456 1,234 "6'15\"" )   # Added 1,234 an 6'15" as extra elements

Это позволяет избежать любой двусмысленности в отношении того, что представляет собой элемент, особенно если элемент может включать такие вещи, как запятые или кавычки (, как в 1,234или 6'15"), или любые другие символы, которые вы позже захотите добавить между каждой парой элементов.. Типичным случаем могут быть не положительные целые числа, но если вы обнаружите, что имеете дело с путями , они потенциально могут содержать любой символ, кроме nul(\0)и отличать один путь от другого, когда они хранятся в одной строке, может быть сложно.

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

add_flanking_string_to_each () {
    # Adds a string to each element in an array,
    # both before each and after each element.
    # Requires bash 4.3+ for using name references.

    # Arg 1: name of input array
    # Arg 2: name of output array (will be emptied)
    # Arg 3: string

    local -n inarray="$1"
    local -n outarray="$2"
    local string="$3"

    local element

    outarray=()
    for element in "${inarray[@]}"; do
        outarray+=( "$string$element$string" )
    done
}

Затем вы вызываете эту вспомогательную функцию для создания данных, которые вы хотите иметь:

for string in "'" "''" '"'; do
    add_flanking_string_to_each p pnew "$string"

   ( IFS=','; printf '%s\n' "${pnew[*]}" )
done

Это выведет

'123','234','456','1,234','6'15"'
''123'',''234'',''456'',''1,234'',''6'15"''
"123","234","456","1,234","6'15""
4
27.01.2020, 23:17

Попробуйте

echo "${p//\'/\'\'}"
''123'',''234'',''456''

, чтобы получить именно то, что вы просили.

0
27.01.2020, 23:17

Теги

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