bash - 使用 Bash 时需要转义哪些字符?

标签 bash shell unix escaping special-characters

在 Bash 中是否有任何需要转义的完整字符列表?可以只用 sed 来检查吗?

特别是,我正在检查 % 是否需要转义。我试过了

echo "h%h" | sed 's/%/i/g'

并且工作正常,没有转义 %。这是否意味着 % 不需要转义?这是检查必要性的好方法吗?

更一般的:它们是在 shellbash 中转义的相同字符吗?

最佳答案

有两个简单而安全的规则,不仅适用于 sh,而且适用于 bash

1。将整个字符串放在单引号中

这适用于除单引号本身之外的所有字符。要转义单引号,关闭它之前的引号,插入单引号,然后重新打开引号。

'I'\''m a s@fe $tring which ends in newline
'

sed 命令:sed -e "s/'/'\\\\''/g; 1s/^/'/;\$s/\$/'/"

2。用反斜杠转义每个字符

这适用于除换行符之外的所有字符。对于换行符,使用单引号或双引号。 仍然必须处理空字符串 - 替换为 ""

\I\'\m\ \a\ \s\@\f\e\ \$\t\r\i\n\g\ \w\h\i\c\h\ \e\n\d\s\ \i\n\ \n\e\w\l\i\n\e"
"

sed 命令:sed -e 's/./\\&/g; 1{$s/^$/""/}; 1!s/^/"/; $!s/$/"/'.

2b。更具可读性的版本 2

有一组简单安全的字符,如 [a-zA-Z0-9,._+:@%/-],可以不转义以使其更具可读性

I\'m\ a\ s@fe\ \$tring\ which\ ends\ in\ newline"
"

sed 命令:LC_ALL=C sed -e 's/[^a-zA-Z0-9,._+@%/-]/\\&/g; 1{$s/^$/""/}; 1!s/^/"/; $!s/$/"/'.


请注意,在 sed 程序中,无法知道输入的最后一行是否以换行字节结尾(除非它为空)。这就是为什么上面的两个 sed 命令都假定它没有。您可以手动添加带引号的换行符。

请注意,shell 变量仅为 POSIX 意义上的文本定义。未定义处理二进制数据。对于重要的实现,二进制工作,但 NUL 字节除外(因为变量是用 C 字符串实现的,并且意味着用作 C 字符串,即程序参数),但是您应该切换到“二进制”语言环境,例如 latin1 .


(您可以通过阅读 sh 的 POSIX 规范轻松验证规则。对于 bash,请查看@AustinPhillips 链接的 reference manual)

关于bash - 使用 Bash 时需要转义哪些字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15783701/

相关文章:

mysql - 如何在 bash 脚本中的 MySQL select 中使用单引号?

linux - 如何在bash中将每行的第一个字母大写?

linux - 如何读取每行命令 lspci 的结果作为数组的一个元素?

bash - 需要简单的脚本来删除所有超过 4 周的 docker 镜像

c - 使用分散聚集处理短读/写的技术?

c - 如何正确使用pidfile库?

bash - 取消由 matlab 启动的 unix 进程

Linux ubuntu awk。找到包含 2 个相同单词的句子放在它们附近

arrays - awk 相当于 C 中的 LTRIM 函数

bash - 让 printf 打印转义的反斜杠