gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:37:52 29 4
gpt4 key购买 nike

在 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com