Python标准库中有一个名为
当您模板化shell脚本并不能保证替换的值仅包含“shell安全”的字符串时,此功能非常有用。
我的问题是:是否存在纯bash编写的等效机制,最多依赖于coreutils?或者甚至是我不知道的bash内置机制?
下面是一个使用此类实用程序(此处称为
shlex.quote
的函数,它接受一个字符串并返回一个可以被Unix shell解释为同一字符串的字符串。这是通过将字符串放在单引号中并转义其中出现的任何单引号字符来实现的。当您模板化shell脚本并不能保证替换的值仅包含“shell安全”的字符串时,此功能非常有用。
我的问题是:是否存在纯bash编写的等效机制,最多依赖于coreutils?或者甚至是我不知道的bash内置机制?
下面是一个使用此类实用程序(此处称为
shlex_quote
)的最小示例:
generate_greeting_script.sh
:#!/bin/bash
cat > greet.sh <<HEREDOC
#!/bin/bash
greeting=$(shlex_quote "$1")
echo "\$greeting \$(whoami)!"
HEREDOC
chmod +x greet.sh
$ ./generate_greeting_script.sh "'ello"
$ ./greet.sh
'ello govnah!
可以使用Python 的 shlex.quote
和 shlex_quote
工具来解决这个问题,但仅为此目的而依赖于Python 是过度杀伤力的。
printf %q
的答案稍微短一些)。有趣的是,printf %q
和${...@Q}
使用不同的方法来执行引号的精确引用:使用printf
时,'ello there
变成了\'ello\ there
,而使用Q
转换则变成了''\''ello there'
。我猜如果有很多引号,printf
的表示更加“高效”,而如果有很多空格,则@Q
更好。 - smheidrich