Можно ли использовать функцию bash, чтобы полностью экранировать любую строку (включая вложенные одинарные кавычки)? - PullRequest
0 голосов
/ 21 июня 2019

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

Пример

echo 'this single quote '"'"' is escaped.'

Есть еще несколько способов сделать это, которые уже хорошо описаны в StackOverflow, но я пытаюсь взять эту концепцию и применить ее как функцию, чтобы избежать всего. Несколько раз мне не удавалось найти универсальное решение для экранирования для Bash (например, я искал библиотеку строк, которая включает экранирование без удачи).

Вот одна из моих попыток:

function quote() {
  printf '%s' "'${1//\'/\'"\'"\'}'"
}

Идея состоит в том, что все одинарные кавычки будут заменены на упомянутый выше escape-стиль '"'"'. Я также попытался сделать то же самое, используя стиль escape, например: \'. Не повезло.

Каждый ответ на эту тему в моем исследовании, с которым я сталкивался, звучит так, будто это невозможно, но я не из тех, кто принимает это за ответ. Для меня, если вы можете отобразить строку, подобную этой: 'test \' test', то она должна быть также выражена в функции, в которой обратные слэши или иным образом добавляются для экранирования символов.

echo '~!@#$%^&*()_+`1234567890-=qwertyuiop[]\QWERTYUIOP{}|ASDFGHJKL:"ZXCVBNM<>?zxcvbnm,./'

Как показано выше, ни одну из основных клавиш на традиционной английской клавиатуре не нужно экранировать, но это требует вложенности кавычек того же типа внутри себя.

Может кто-нибудь пролить свет на это? Я упускаю что-то очевидное или это действительно так сложно?

Ответы [ 2 ]

2 голосов
/ 21 июня 2019

Вам не нужно имитировать кавычки оболочки, правильного цитирования переменных должно быть достаточно.

#! /bin/bash

tag () {
    echo Setting tags to "$2".
}

while read tags ; do
    tag --set "$tags"
done  <<EOF
tag1,tag2,tag3
Tom's_Shoes
The_"best"
EOF
0 голосов
/ 22 июня 2019

Если теги находятся в переменных или массиве и вы используете правильное цитирование, вам не нужно делать никаких дополнительных экранировок.См. Ответ @ choroba.

Но бывают случаи, когда это необходимо, и это поможет:

printf -v my_var '%q' "$myvar"

, который заменяет содержимое my_var на экранированную версию.

...