Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash POSIX规范说这是避免歧义所必需的,这意味着什么?_Bash_Shell_Sh_Variable Expansion - Fatal编程技术网

Bash POSIX规范说这是避免歧义所必需的,这意味着什么?

Bash POSIX规范说这是避免歧义所必需的,这意味着什么?,bash,shell,sh,variable-expansion,Bash,Shell,Sh,Variable Expansion,在答复时: 现在我得到了两个“:”是独立的,这就是为什么我找不到任何关于它们的文档。这种情况下需要第一个吗 我第一次注意到规范中的这一段: 在前面所示的参数扩展中,使用格式中的应导致对未设置或空的参数进行测试;省略该项将导致对仅未设置的参数进行测试。如果参数为“#”且省略了冒号,则应用程序应确保指定了word(这对于避免字符串长度扩展的歧义是必要的) 我在bash参考手册中看到了相应的解释: 当不执行子字符串扩展时,使用下面描述的形式(例如“:-”),Bash测试未设置或为null的参数。省略冒

在答复时:

现在我得到了两个“:”是独立的,这就是为什么我找不到任何关于它们的文档。这种情况下需要第一个吗

我第一次注意到规范中的这一段:

在前面所示的参数扩展中,使用格式中的应导致对未设置或空的参数进行测试;省略该项将导致对仅未设置的参数进行测试。如果参数为“#”且省略了冒号,则应用程序应确保指定了word(这对于避免字符串长度扩展的歧义是必要的)

我在bash参考手册中看到了相应的解释:

当不执行子字符串扩展时,使用下面描述的形式(例如“:-”),Bash测试未设置或为null的参数。省略冒号只会导致对未设置的参数进行测试。换句话说,如果包含冒号,操作符将测试参数的存在性及其值是否不为null;如果省略冒号,则运算符只测试是否存在

我了解这些扩展的冒号版本的区别

刚才让我困惑的是规范中的这句话:

如果参数为“#”且省略了冒号,则应用程序应确保指定了word(这对于避免字符串长度扩展的歧义是必要的)

如果
word
未指定,我不明白这里可能存在什么歧义

所有扩展符号在shell变量名中都无效,因此它们不可能启动单个字符的变量名。如果他们可以使用
#
参数
总是不带冒号,因为你永远无法判断
${foo}
是否意味着变量
foo
的长度,或者
#
的另一个扩展,等等


我错过了什么?什么样的歧义需要确保
word
存在?(我的意思是在这个扩展中没有
word
显然没有用处,但这不是一回事。)

-
也是一个shell特殊参数,其值是一个字符串,指示当前设置了哪些shell选项。比如说,

$ echo $-
himBH
${#parameter}
是参数长度的语法

$ foo=bar
$ echo ${#foo}
3

因此,表达式
${#-}
是不明确的:它是
$-
值的长度,还是如果
$
为空,它是否扩展到空字符串?(不太可能,因为
$#
始终是一个整数,不能取消设置,但在语法上是合法的。)我将规范解释为意味着
${#-}
应该通过扩展到
$-
的长度来解决歧义(这是大多数shell似乎都会做的)。

您的一些引用似乎缺少一些单词。你能检查一下你是否正确地复制和粘贴了所有内容吗?我的猜测是应用程序应该在
${{code-}
${{foo}
之间做出区别:因为
总是被设置的,当应用程序解析
的开头时${#-
不能到此为止,要知道这是否意味着扩展
;记住
-
是一个有效的变量名。
${#?}
vs
${foo}
。是的。
$?
也是如此。
${code>。
${
可能是
$?
的长度,或者当
$#
未设置时是一条空的错误消息(这不太可能)。另一种情况是语法不明确,但语义提供了一个简单的选择。啊。这是有道理的,尽管我认为规范的措辞使
${#?}
${35;-}
一个错误,而不是为了长度解释而解决的。因为没有指定单词。虽然我意识到这对解释没有多大用处。好的观点。这似乎是一个更清晰的解释,尽管我不知道在任何情况下,
#
可能会因为选择或存在wor而不确定这很重要。