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

2024-01-09

Bash 中是否有需要转义的字符的完整列表?是否可以仅通过检查sed?

特别是,我正在检查是否%是否需要逃避。我试过

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

并且工作得很好,没有逃脱%。是不是意味着%不需要逃避吗?这是检查必要性的好方法吗?

更一般地说:它们是相同的字符来转义吗?shell and bash?


有两条简单而安全的规则不仅适用于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 。


(您可以通过阅读 POSIX 规范轻松验证规则sh。对于 bash,请检查参考手册 http://www.gnu.org/software/bash/manual/bashref.html#Quoting由@AustinPhillips 链接)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Bash 时哪些字符需要转义? 的相关文章

随机推荐

  • 另一个函数内的函数前向声明

    代码先行 void foo int x void bar int is this forward decl legal bar x void bar int x do stuff 在上面的代码中 foo calls bar 通常我把前向声明
  • 使用 ROOM 和 @Database 注解执行 org.jetbrains.kotlin.gradle.internal.KaptExecution 时发生故障

    我正在使用 Room 进行离线存储 我的模型包含 Room 不支持的列表 并且我编写了类型转换器 但现在我收到此错误 当我删除 Database 注释时 错误就会出现 但使用 Database 注释时 它会显示错误 这是我所有相关的课程 这
  • 加载图像的 jQuery 事件

    是否可以通过 jQuery 事件检测所有图像何时加载 理想情况下 应该有一个 document idle function or document contentLoaded function 但我找不到这样的东西 我想附加一个这样的事件
  • 使用 Node.js 设置语言提示的 Google Vision API 文本检测

    我在用着 google cloud vision使用 Node js 我使用如下示例代码 async function quickstart try Imports the Google Cloud client library const
  • 如何从 Perl 创建然后使用长 Windows 路径?

    我有一个构建过程的一部分 它在 Windows 中创建了一条长得可怕的路径 这不是我的错 它有几个目录深 并且没有一个目录名异常长 它们又长又多 足以让它过去MAX PATH 260 个字符 我在这些名称中没有使用除 ASCII 之外的任何
  • Java jar 文件未在 Linux 终端中运行

    我正在尝试运行 jar在 Linux 上的终端中输入文件但出现错误 root localhost dist java jar helloworld jar Exception in thread main java lang ClassFo
  • Java 线程与 Pthreads

    我今天在接受采访时被问到这个问题 当我们创建一个线程时pthread create POSIX 线程 线程自行启动 为什么我们需要显式调用start 在爪哇 当我们创建线程实例时 Java 不启动线程的原因是什么 我脑子一片空白 面试官时间
  • 在antlr中获取纯文本而不是令牌

    我正在尝试使用 antlr 创建一个解析器 我的语法如下 code codeBlock EOF codeBlock text tag1Ops tag2Ops tag1Ops START 1 TAG ID END 2 TAG tag2Ops
  • 为什么我们在使用类转换器时不应该使用enableImplicitConversion?

    The 类转换器文档 https github com typestack class transformer implicit type conversion say 隐式类型转换注意如果您将类验证器与类转换器一起使用 您可能不想启用此功
  • 将 C 字符串转换为 unsigned char 指针

    我正在使用许多字节编译低级代码 在某些情况下 使用双引号括起来的旧 C 字符串来定义对我来说很方便 但是 当使用 gcc 或 g 进行编译时 不知道其他编译器的行为 它一直困扰着我的指向字符串的符号 基本上当我写这个的时候 const un
  • 使用 FormBuilder 创建禁用的表单组

    假设我们有myFormGroup它是通过 FormBuilder 初始化的 this myFormGroup this fb group field1 SomeValidator1 field2 AnotherValidator2 fiel
  • 带有缓存存储的 Angular 5

    我尝试在 Angular 5 中使用 CacheStorage 的承诺 如文档中所示 let test caches open test test then result Cache gt result add test png 但我得到了
  • 帮助匹配两个类之间的字段

    我对 Java 还不太有经验 我希望有人能引导我走向正确的方向 因为现在我感觉我只是在用头撞墙 第一个类称为 MeasuredParams 它有 40 多个数字字段 身高 体重 腰围尺寸 手腕尺寸 一些是整数 但大部分是双精度型 第二类是统
  • 保存前受影响的 Mongoose _id

    var mongoose require mongoose mongoose connect mongodb localhost test var Cat mongoose model Cat name String var kitty n
  • Imagebutton 完整图像,圆角

    嗯 我的 Android 应用程序中有一些 ImageButtons 我希望他们展示完整的图片 我的意思是 我希望 ImageButton 只是图片 你知道吗 好吧 到目前为止 一切顺利 我可以使用 背景 属性来做到这一点 不过我也希望 I
  • 部署 Cloud Functions 后出现错误:无法刷新访问令牌。

    我已经用 Firebase Cloud Functions 进行了一段时间的实验 今天我对我的 index json 文件做了一个小小的更改 在要设置的文档中添加了一个字段 在 Firebase Console gt Functions g
  • 如何保持控件禁用直到线程结束

    我正在通过 GPS 调制解调器使用以下代码通过 comport 发送短信 Thread thread null private void btnsend Click object sender EventArgs e if thread n
  • Android:层次结构查看器不存在

    我在 Mac Sierra 上使用 Android Studio 2 3 打开设备监视器时找不到层次结构查看器 视角列表中没有查看者 有人知道这是为什么吗 无法评论 无代表 更新到最新的构建工具后 层次结构查看器和一堆其他东西已从工具目录中
  • MVC Ajax 更新面板

    我知道 至少我很确定 没有像 asp UpdatePanel 这样的 MVC 控件 谁能给我一些关于如何做到这一点的想法 我有一个集合 我从我的存储库和服务层添加条目 在我的主页中 我想根据此集合中是否有任何内容来显示警报 通常我会有一个
  • 使用 Bash 时哪些字符需要转义?

    Bash 中是否有需要转义的字符的完整列表 是否可以仅通过检查sed 特别是 我正在检查是否 是否需要逃避 我试过 echo h h sed s i g 并且工作得很好 没有逃脱 是不是意味着 不需要逃避吗 这是检查必要性的好方法吗 更一般