用 X"" 测试空字符串[重复]

2024-01-19

我知道我可以在 Bash 中测试空字符串-z像这样:

if [[ -z $myvar ]]; then do_stuff; fi

但我看到很多代码都是这样写的:

if [[ X"" = X"$myvar" ]]; then do_stuff; fi

这种方法更便携吗?难道这只是前世的历史残骸吗?-z?它适用于 POSIX shell(尽管我已经看到它在脚本定位中使用)bash)?准备好我的历史/可移植性课程。


在服务器故障上也提出了同样的问题如何判断bash变量是否为空? https://serverfault.com/questions/7503/但没有人对此做出解释why你会看到代码X"" stuff.


从根本上说,因为在很久以前,test更加复杂,并且在不同系统之间没有统一定义(因此必须仔细编写可移植代码以避免不可移植的构造)。

特别是之前test是一个内置的 shell,它是一个单独的可执行文件(请注意,MacOS X 仍然有/bin/test and /bin/[作为可执行文件)。当这种情况发生时,写下:

if [ -z $variable ]

when $variable为空将通过其别名调用测试程序[有 3 个参数:

argv[0] = "["
argv[1] = "-z"
argv[2] = "]"

因为变量是空的所以没有什么可以扩展的。因此,编写代码的安全方法是:

if [ -z "$variable" ]

这工作可靠,将 4 个参数传递给test可执行的。诚然,几十年来,测试程序一直内置于大多数 shell 中,但旧设备很难消亡,更早以前学到的良好实践也是如此。

X 前缀解决的另一个问题是,如果变量包含前导破折号,或者包含等于或其他比较器,则会发生什么情况。考虑一下(一个不太好的例子):

x="-z"
if [ $x -eq 0 ]

这是带有杂散(错误)参数的空字符串测试,还是带有非数字第一个参数的数字相等测试?在 POSIX 标准化行为之前(大约 1990 年),不同的系统提供了不同的答案。因此,处理此问题的安全方法是:

if [ "X$x" = "X0" ]

或者(根据我的经验,不太常见,但完全等效):

if [ X"$x" = X"0" ]

正是像这样的所有边缘情况,与测试是单独的可执行文件的可能性相关,这意味着可移植 shell 代码仍然比现代 shell 实际需要的更大量地使用双引号,并且 X 前缀表示法用于确保事情不会被误解。

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

用 X"" 测试空字符串[重复] 的相关文章

随机推荐

  • 如何使用 boost::program_options 创建选项别名?

    我希望能够创建选项别名boost program options将它们的参数存储在相同的键 标签下 我的软件的架构根据值使用不同的专用选项解析器argv 1 然而 有些选项是共享的 比如我的选项 inputs inputOptions ad
  • 为什么这种提取在示例上工作正常,但在真实网址上却不起作用?

    我正在尝试提取内容href在班上a 里面是 td class DataZone 它适用于下面的示例 from bs4 import BeautifulSoup text td class DataZone div div style fon
  • 使用 TortoiseGit 推送到远程 URL

    我已经安装了最新的MSysGit 1 6 3 http code google com p msysgit 预览和乌龟Git 0 6 2 http code google com p tortoisegit 在我的 Windows XP 电
  • Yii2 干净的 URL 和操作参数

    我已经在 Yii2 应用程序上启用了干净的 URL 但我似乎无法将参数传递给操作 我期望这样 本地主机 应用程序 网络 a b c d 映射到以下内容 AController gt actionB c d 这并没有发生 这是我的 htacc
  • Spring Boot重定向到html页面

    这是springboot的一个控制器 我想写一个重定向到html页面的函数 但它总是响应404 这是代码和属性 Component Controller RequestMapping Weixin public class KindlePo
  • ReactJS 组件 PropTypes - 使用一组参数指定函数类型

    我在react 版本0 13 3 组件中指定所需的函数proptype var MyComponent React createClass propTypes onClick React PropTypes func isRequired
  • Flutter - 使用 Google API 发送电子邮件

    经过大量研究和修复问题 我到达了我的以下位置 github https github com rafaelcb21 gmail api flutter 但我不知道我是否正确安装了 json 由于出现以下错误 error errors dom
  • 如何验证类属性?

    背景 我有一个 CSV 文件 我需要准备并验证每行中的每个元素 并创建一个具有有效数据的类的集合 IE CSV 文件如下所示 EmpID FirstName LastName Salary 1 James Help 100000 2 Jan
  • 动态改变约束

    我有一个 dijit form NumberTextBox 输入字段 以这些参数开头 new dijit form NumberTextBox id din1 style width 60px constraints places 0 pa
  • Jquery:如何将TD移动到另一个TR?

    我已经生成了 html 我需要使用 Jquery 重构 html 如下所示 原来的 table tr td Col 1 Value td tr tr td Col 2 Value td tr tr td Col 3 Value td tr
  • 从 EmberJS 中的路线观察服务上的属性

    我想我不理解这里的概念 据我所知有任何Ember object可以观察另一个人的属性Ember object 所以 我有一个服务 一个路由器和一个组件 我需要组件和路由器能够观察服务的属性 我完全有可能只是以错误的方式构建解决方案 我将在最
  • 向停靠且具有自动滚动功能的面板添加填充

    我的表单底部有一个面板 该面板设置为 自动滚动 以便在需要时出现滚动条 我有一个动态添加到此面板的图像 一切看起来都很好 除了最后一张图像 因为这里表单的最边缘是一个图像 例如 有谁知道如何在面板的右侧添加填充 是的 我确实尝试设置面板右侧
  • Thymeleaf + Spring(非 Boot)-如何显示来自 messageSource 的消息

    我在使用 Thymeleaf 设置 Spring MVC 不使用 Boot 因为我在发现 Spring Initializr 之前启动了它 以显示来自我的资源包的消息时遇到了问题 该应用程序的主要配置类是 Configuration Ena
  • 在 C++ std::vector 和 C 数组之间进行转换而不进行复制

    我希望能够在 std vector 及其底层 C 数组 int 之间进行转换 而无需显式复制数据 std vector 是否提供对底层 C 数组的访问 我正在寻找这样的东西 vector
  • App Store 必须使用 iOS 15 SDK 或更高版本构建,包含在 Xcode 13 或更高版本中

    错误 ITMS 90725 SDK 版本问题 此应用程序是使用 iOS 14 4 SDK 构建的 提交到 App Store 的所有 iOS 应用程序都必须使用 iOS 15 SDK 或更高版本构建 包含在 Xcode 13 或更高版本中
  • R 中带有加权数据的频率表

    我需要按年龄和婚姻状况计算个人的频率 所以通常我会使用 table age marital status 然而 每个人在数据采样后都有不同的权重 如何将其合并到我的频率表中 您可以使用函数svytable从包装中survey or wtd
  • 访问属性“H”的权限被拒绝

    我编写了下面的代码来使用java脚本捕获网页的整个屏幕截图 我在用着 火狐版本 49 0 1 铬版本 54 0 2840 59 m硒版本 3 0 0 OS Win10 64位Java 1 8 import java io File impo
  • 使用 Tor + Privoxy 抓取谷歌购物结果:如何避免被阻止?

    我已经安装了Tor Privoxy在我的服务器上 它们工作正常 已测试 但现在当我尝试使用urllib2 python 当然 使用代理来抓取谷歌购物结果 我总是被谷歌阻止 有时是503错误 有时是403错误 那么任何人有任何解决方案可以帮助
  • 使用socket.io/node.js在网页上显示流式twitter

    我正在尝试使用 node js socket io 和 twit 构建 Twitter 流式 Web 应用程序 var express require express app express http require http server
  • 用 X"" 测试空字符串[重复]

    这个问题在这里已经有答案了 我知道我可以在 Bash 中测试空字符串 z像这样 if z myvar then do stuff fi 但我看到很多代码都是这样写的 if X X myvar then do stuff fi 这种方法更便携