bash函数可以用于完全转义任何字符串(包括嵌套的单引号)吗?

时间:2019-06-21 20:00:21

标签: bash nested escaping quotes

我知道有很多方法可以手动转义相同类型的嵌套引号。

示例

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

还有更多的方法可以做到这一点,已经在StackOverflow上对此进行了很好的记录,但是我正在尝试采用该概念并将其作为功能来逸出所有内容。我多次未能找到针对Bash的全逃逸解决方案(例如,我一直在寻找一个字符串库,其中包含没有逃逸的逃逸)。

这是我的尝试之一:

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

这个想法是所有单引号都将被上述转义样式'"'"'代替。我还尝试过使用转义样式执行相同的操作,例如:\'。没有运气。

我在研究中遇到的有关该主题的每一个回答都听起来似乎是不可能的,但是我不是那种接受答案的人。对我来说,如果您可以回显这样的字符串:'test \' test',那么它也应该可以在函数中表示,在函数中还会自动添加反斜杠或其他方式来转义字符。

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

如上所示,传统英语键盘上的所有基本键都不需要转义,但是在其内部嵌套相同类型的引号则需要

有人能对此有所启发吗?是我遗漏了明显的东西还是真的那么难?

2 个答案:

答案 0 :(得分:2)

您无需模仿shell引用,正确引用变量就足够了。

#! /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

答案 1 :(得分:0)

如果标记位于变量或数组中,并且使用正确的引号,则无需进行任何额外的转义。参见@choroba的答案。

但是有时候您需要它,这可以解决问题:

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

用外壳转义的版本替换my_var的内容。