我如何学习如何在 bash 中正确引用?

2023-12-15

当我编写 bash 脚本时,我经常对引用和评估的规则感到困惑。我知道一些基础知识,比如 '' 和 "" 和 `` 之间的区别,但我似乎仍然经常出错,并且不得不尝试用各种不同的方式来表达同一件事。

我通常可以通过蛮力解决任何个人问题,但我认为我的概念模型必须以某种未知的方式无可救药地被打破。

我对 lisp 的 quote、eval、read、print、syntax-quote 系统没有任何问题。事实上,我写了一些 kata 来帮助人们理解发生了什么:http://www.learningclojure.com/2010/11/syntax-quote-kata-for-confused.html

我想我正在为 bash 寻找类似的东西(这看起来要复杂得多)。一个好的模型,或者一组练习可以帮助我形成这样的模型,这将使​​我能够查看复杂的 shell 脚本,其中变量被转换、评估、打印和读取,并计算出将要发生的情况无需尝试。

如果做不到这一点,调试过程并观察评估每个阶段发生的情况的好方法将非常有帮助。


Bruce Barnett 的 UNIX Shell 引用教程太棒了,还有 BashFAQ/pitfalls/分词文章中有大量有用的提示。简短摘要:

Unquoted字符串可以包含大多数字符,但不是所有字符(如换行符),并且其中许多字符(包括空格)必须进行转义。只是不要使用它们 - 如果您受到诱惑,您可能会发现修改脚本的人忘记在必要时包含引号。

单引号字符串可以包含大多数字符,包括 NUL 和换行符,但不能包含单引号,因此它们也仅适用于简单值。

反引号用于命令。仅当您的 shell 不支持时才应使用它们$()。例子:

current_dir=`pwd` # BAD! Don't do this!

该命令很糟糕,因为当赋值的右侧未加引号时,shell 会执行分词在上面。它通常会导致难以重现的错误,因为空格很难目视检查。到引用命令 you have to use 双引号:

current_dir="$(pwd)" # OK, but loses newlines at EOF

EOF 处的换行符尤其棘手。您可以添加单个字符并将其删除,例如

# Works for some commands, but not pwd
current_dirx="$(pwd; echo x)"
current_dir="${current_dirx%x}"
printf %s "$current_dir"

,但是还有一个额外的困难,因为有些命令(例如pwd) 将在输出末尾添加换行符anyway,所以你可能还需要删除它:

# Works for some commands, including pwd
current_dirx="$(pwd; echo x)"
current_dir="${current_dirx%$'\nx'}"
printf %s "$current_dir"

双引号可以包含any字符(尝试echo -ne "\0" | wc -c),但请注意变量不能包含 NUL 字符。

ANSI-C 引用可以包含任何字符除 NUL 外 (Try echo -ne $'\0' | wc -c),并提供方便的转义码,以便更轻松地使用特殊字符:

printf %s $'--$`!*@\a\b\E\f\r\t\v\\\'"\360\240\202\211 \n'
printf %q $'--$`!*@\a\b\E\f\r\t\v\\\'"\360\240\202\211 \n'
touch -- $'--$`!*@\a\b\E\f\r\t\v\\\'"\360\240\202\211 \n'
rm -- $'--$`!*@\a\b\E\f\r\t\v\\\'"\360\240\202\211 \n'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我如何学习如何在 bash 中正确引用? 的相关文章

随机推荐

  • 无法使用 Logitech C920 访问 cv::VideoCapture 的属性

    我正在使用 Logitech C920 和 OpenCV 开发一个小型网络摄像头应用程序 实际上 我可以从相机获取图像 对于给定的分辨率没有任何问题 但除了框架宽度和高度之外 我无法访问相机中的任何设置 我有以下代码 正如您所猜测的 该代码
  • 安装 android studio 时安装 HAXM 失败

    无法安装英特尔 HAXM 此计算机满足 HAXM 的要求 但未开启 Intel 虚拟化技术 VT x 在启用 VT x 之前无法安装 HAXM 此消息出现在安装过程之间 但在安装工作室运行之后 请让我了解 HAXM 安装失败对工作室的影响
  • CSS:100% 宽度或高度,同时保持纵横比?

    目前 通过 STYLE 我可以使用width 100 and auto在高度上 反之亦然 但我仍然无法将图像限制在特定位置 分别是太宽或太高 有任何想法吗 如果您仅在图像上定义一个维度 则图像长宽比将始终保留 问题是图像比您喜欢的更大 更高
  • Rails 搜索查询关联模型

    In 轨道广播 37它们显示了我正在尝试实现的简单搜索 我有以下关联 class Owner lt ActiveRecord Base has many dogs end class Dog lt ActiveRecord Base bel
  • 从 sudo minikube start --vm-driver none 切换到 --vm-driver docker 并且无法再访问我的应用程序

    我刚刚将 Minikube 1 7 3 升级到 1 10 1 并想从 vm driver none to vm driver docker 一切正常 我的应用程序已部署 我没有任何问题 但我的应用程序都不可用 我得到 Connection
  • 如何返回子数组的聚合,并在最顶部数组上使用过滤器? [复制]

    这个问题在这里已经有答案了 我想获取特定序数的所有编排数据 这是初始数据 id 5c7464a26b47a13470411031 affiliation liss family year 2019 weekNumber 9 chart ch
  • 在 C# 中将字符串数组编组为 char **

    我正在调用 C DLL 函数 需要提供以下 C 结构 typedef struct char mTableId char mFieldNames int mNumFields char mFilter char mSort int mOff
  • 引用其他类中的 Windows 窗体元素

    我对 Windows 窗体编程非常陌生 我遇到了一个问题 我有一个Windows窗体 Form1 带有文本框 tbx Log 在同一项目的另一个类中 我想向日志文本框写入一些内容 但我无法在该类中引用 tbx Log 我怎样才能实现这个目标
  • SSH 密钥:“‘id_rsa.pub’的权限 0644 过于开放。”在苹果电脑上

    我在我的mac上生成了一个ssh密钥对并将公钥添加到我的ubuntu服务器 实际上 它是我的mac上的虚拟机 但是当我尝试登录ubuntu服务器时 它说 WARNING UNPROTECTED PRIVATE KEY FILE Permis
  • 通过动态提供的对象属性列表按顺序对对象数组进行排序,然后按样式

    如何以 orderBy thenBy 样式编写通用排序函数 该函数按以数组形式提供的属性列表对数组进行排序 var items name AA prop1 12 prop2 13 prop3 5 prop4 22 name AA prop1
  • 读取事件查看器条目

    我想从 C 程序的某个自定义事件日志中读取事件条目 并通过它们的描述来过滤它们 有办法做到吗 或者一种将条目作为集合获取的方法 以便我能够按条件从中进行选择 尝试这样的事情 string queryString string Format
  • Bootstrap CSS 主动导航

    在 Bootstrap 网站上 子导航与各个部分相匹配 并在您滚动到该部分时更改背景颜色 我想创建自己的菜单 没有所有背景颜色和所有内容 但是 我将 CSS 更改为类似的 但是当我向下滚动或单击菜单项时 活动类不会切换 不确定我做错了什么
  • 重新采样每日数据以获得每月数据帧?

    我有一个每日数据框 我正在尝试resample以获得每月的Open High Low Close daily df Open High Low Last Close Date 2010 01 04 55 15 57 55 54 55 57
  • 为gt表中的data_color设置不对称中点

    我正在尝试使用 gt 包从 538 重新创建一个简单的表 我想使用 0 作为色阶域的中点并将其设置为白色 但 0 不是实际域的中点 df lt tribble SEASON ACC BIG 10 BIG 12 PAC 12 SEC 2019
  • JavaScript 中的数据竞争?

    假设我运行这段代码 var score 0 for var i 0 i lt arbitrary length i async task i function score increment callback function 从理论上讲
  • Android 崩溃报告中的奇怪堆栈

    我收到一些来自 android 的崩溃报告 带有 java lang NullPointerException 但是我不明白 stacktrace 中的 null 是什么意思 below at null formatElapsedTime
  • matplotlib 或其他 python 包中的 3D 饼图

    有没有办法在 matplotlib 中渲染 3D 饼图 或者是否有可以生成 3D 饼图的 Python 包 EDIT 我其实已经知道了pygooglechart 但我正在寻找可以离线完成的东西 我很抱歉忘记包含此信息 对于那些提供pygoo
  • C++ 中的逗号运算符和逗号分隔符[重复]

    这个问题在这里已经有答案了 可能的重复 all 时逗号运算符不充当逗号运算符吗 逗号 何时充当运算符 何时充当分隔符 其后果是什么 如果可能 请也为两者提供小例子 逗号在函数调用 函数声明 初始值设定项和变量声明中充当分隔符 f a b i
  • 将数据库中特定模式的所有内容授予 PostgreSQL 中的组角色

    使用 PostgreSQL 9 0 我有一个名为 staff 的组角色 并且希望向该角色授予特定模式中表的所有 或某些 权限 没有以下工作 GRANT ALL ON SCHEMA foo TO staff GRANT ALL ON DATA
  • 我如何学习如何在 bash 中正确引用?

    当我编写 bash 脚本时 我经常对引用和评估的规则感到困惑 我知道一些基础知识 比如 和 和 之间的区别 但我似乎仍然经常出错 并且不得不尝试用各种不同的方式来表达同一件事 我通常可以通过蛮力解决任何个人问题 但我认为我的概念模型必须以某