首页 > 解决方案 > bash 函数可以用来完全转义任何字符串(包括嵌套的单引号)吗?

问题描述

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

例子

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

StackOverflow 上已经有更多的方法可以做到这一点,但我正在尝试采用这个概念并将其作为一个函数来逃避一切。我已经好几次没有成功地为 Bash 找到一个多合一的转义解决方案(例如,我一直在寻找一个包含转义但没有运气的字符串库)。

这是我的尝试之一:

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

这个想法是所有单引号都将替换为上述转义样式'"'"'。我也尝试过使用转义风格做同样的事情,如下所示\':没运气。

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

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

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

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

标签: bashnestedescapingquotes

解决方案


您不需要模仿 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

推荐阅读