当前位置: 首页 > 面试题库 >

变量名后的'-'(破折号)在这里做什么?

徐隐水
2023-03-14
问题内容
if [ -n "${BASH-}" -o -n "${ZSH_VERSION-}" ] ; then
    hash -r 2>/dev/null
fi

在哪里可以找到参考?谢谢。


问题答案:

a ${...}中的变量称为“参数扩展”。在在线手册或实际手册中
搜索该术语(第792行)。 该形式是在形式上相似。仅在展开前一行(行810)说明了差异:
${var-}``${var:-}``:-

… bash测试未设置或为null的参数。省略冒号只会对未设置的参数进行测试。

因此,这种形式是测试仅当变量被复位( 不为空),并且替换整个扩张${...}为后的值-,在这种情况下是

因此,${var-}变为:

  1. 当var具有值(而不是null)时,var的值。
  2. 另外,当var为null:时,var的值(冒号:丢失!)''也因此为null。
  3. ''如果未设置var ,则-之后的值(在这种情况下为null )。

所有这些实际上就是:

  1. 展开为''var未设置或为null时。
  2. 扩展到var的值(当var具有值时)。

因此,扩展没有改变var的值,也没有扩展,只是在shell nounset设置了选项的情况下避免了可能的错误。

代码将在以下两种用途上均停止$var

#!/bin/bash
set -u

unset var

echo "variable $var"
[[ $var ]] && echo "var set"

但是,此代码将正确运行:

#!/bin/bash
set -u

unset var
echo "variable ${var-}"
[[ ${var-} ]] && echo "var set"


 类似资料:
  • 我试图将像“plex”或“emby”这样的实时代码转换与我的应用程序集成在一起。 我可以服务dash内容到shaka-player或dash.js,但只有在“现场模式”。但我想通过玩家来实现搜索。 我看了一下plex,为了启用这一点,他们创建了自己的mpd文件和持续时间,这样玩家就有了一个完整的搜索栏。 然而,当寻找时,玩家会要求一个段号,如:449。我需要停止ffmpeg并使用偏移量重新启动,但

  • 问题内容: 我有这个json字符串,我知道php变量名称不支持破折号。那么在这种情况下该怎么办? 问题答案: 您可以使用像这样的数组格式。连字符的键将起作用。 这是一个演示

  • 问题内容: 我要备份数据库时出现错误 有什么办法可以用表名(temp_01-01-000001)解决这个问题。 问题答案: 您可以编辑文件/system/database/drivers/mysql/mysql_utility.php的第132行 从: 至:

  • 问题内容: 我在这里遇到了这个奇怪的CSS代码: 我以前从未见过这样的CSS属性名称,也找不到有关它们的信息。但是浏览器检查器(在Chrome,Safari和Firefox中进行了检查)说它们是有效的CSS属性,因此它必须是CSS标准。 我试图添加我自己的属性,并且它是有效的: 这些属性是做什么的?CSS标准描述了什么?在哪里可以找到有关它的参考? 问题答案: 双引号用于定义自定义属性。 来自W3

  • 我有一个values.yaml,我将一个值存储在一个属性中,还有一个deployment.yaml,我尝试将该值赋给一个环境变量。问题是属性名包含破折号,并抛出以下错误消息。 “空值”是因为我试图将名称引用为 {{ Values.security.enablemockservice | 引号 }},而不使用缓行绑定的破折号,但实际的属性名称是 Values.security.enable-mock

  • 问题内容: 我对java8流中和方法之间的区别感到困惑。例如, 我得到空的输出在这里,但如果我改变地图就像 我可以得到 {1 = 1,2 = 2} 为什么只是没有运行方法?它们之间有什么区别? 问题答案: 什么都不做,因为在执行终端操作之前不会处理流管道。因此,残留物为空。 在流管道中添加终端操作将导致针对终端操作所需的每个元素执行操作(某些终端操作仅需要一个元素,而其他终端操作则需要的所有元素)