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

Can a bash function be used to fully escape any string (including nested single quotes)?

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

例子

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

Whosebug 上已有详细记录,还有其他几种方法可以执行此操作,但我正在尝试采用该概念并将其作为函数应用以转义所有内容。我已经多次未能找到 Bash 的一体化转义解决方案(例如,我一直在寻找一个包含转义的字符串库,但没有成功)。

这是我的尝试之一:

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

想法是将所有单引号替换为上述转义样式 '"'"'。我也尝试过使用像这样的转义样式来做同样的事情:\'。运气不好。

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

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

如上所示,传统英文键盘上的none个基本键需要转义,但嵌套相同类型的引号本身需要转义。

任何人都可以阐明这一点吗?我是否遗漏了一些明显的东西,或者这真的有那么难吗?

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

#! /bin/bash

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

while read tags ; do
    tag --set "$tags"
done  <<EOF
tag1,tag2,tag3
Tom's_Shoes
The_"best"
EOF

如果标签在变量或数组中并且您使用了正确的引号,则您不需要进行任何额外的转义。请参阅@choroba 的回答。

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

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

用 shell-escaped 版本替换 my_var 的内容。