$var?中bash变量参数扩展中的问号是啥意思?
Posted
技术标签:
【中文标题】$var?中bash变量参数扩展中的问号是啥意思?【英文标题】:What is the meaning of a question mark in bash variable parameter expansion as in $var??$var?中bash变量参数扩展中的问号是什么意思? 【发布时间】:2012-02-11 22:37:28 【问题描述】:这样使用的 bash 变量是什么意思:
$Server?
【问题讨论】:
【参考方案1】:它的工作原理几乎与(来自bash
联机帮助页):
$parameter:?word
Display Error if Null or Unset. If parameter is null or unset, the expansion of word (or a message to that effect if word is not present) is written to the standard error and the shell, if it is not interactive, exits. Otherwise, the value of parameter is substituted.
该特定变体检查以确保变量存在(已定义且不为空)。如果是这样,它会使用它。如果没有,则输出word
指定的错误消息(如果没有word
,则输出合适的错误消息)并终止脚本。
该版本与非冒号版本之间的实际区别可以在引用部分上方的bash
手册页中找到:
当不执行子字符串扩展时,使用下面记录的形式,
bash
测试未设置或为空的参数。 省略冒号会导致仅对未设置的参数进行测试。
也就是说,上面的部分可以修改为读取(基本上是去掉“null”位):
$parameter?word
Display Error if Unset. If parameter is unset, the expansion of word (or a message to that effect if word is not present) is written to the standard error and the shell, if it is not interactive, exits. Otherwise, the value of parameter is substituted.
区别如下:
pax> unset xyzzy ; export plugh=
pax> echo $xyzzy:?no
bash: xyzzy: no
pax> echo $plugh:?no
bash: plugh: no
pax> echo $xyzzy?no
bash: xyzzy: no
pax> echo $plugh?no
pax> _
在那里,您可以看到虽然未设置 和 null 变量都会导致 :?
出现错误,但只有未设置一个会导致 ?
出现错误。
【讨论】:
而且不带字,有一个默认的错误信息“参数为空或未设置”(相同的信息有或没有冒号)。 没错。指向另一个描述的链接tldp.org/LDP/abs/html/parameter-substitution.html#QERRMSG【参考方案2】:这意味着如果没有定义变量,脚本应该中止
例子:
#!/bin/bash
echo We will see this
$Server?Oh no! server is undefined!
echo Should not get here
此脚本将打印出第一个回声,以及“哦,不!...”错误消息。
在此处查看 bash 的所有变量替换: https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html
【讨论】:
请不要链接 ABS - 它因在其示例中展示不良实践代码而臭名昭著。改为考虑the bash-hackers' wiki page on parameter expansion、the Wooledge BashGuide,甚至the official bash manual。【参考方案3】:根据man bash
:
$parameter:?word
如果参数为 null 或未设置,则将 word 的扩展(或如果 word 不存在,则将产生一条消息)写入标准错误,并且 shell,如果它不是交互式的,则退出。否则,参数的值被替换。
因此,如果您省略 word
并且不将 $1
传递给您的函数或 shell 脚本,那么它将退出并出现以下错误:
-bash: 1: parameter null or not set
但是,您可以放置一个用户定义的错误,让您的调用者知道尚未设置所需的参数,例如:
local arg1="$1:?needs an argument"
只有在设置了$1
时才会继续运行脚本/函数。
【讨论】:
【参考方案4】::?
如果给定参数为 null 或未设置,则导致(非交互式)shell 退出并显示错误消息。您正在查看的脚本省略了错误消息;通常,您会看到类似
foo=$1:?Missing first argument
例如,
$ foo=$1:?Missing first argument
bash: 1: Missing first argument
$ set firstarg
$ foo=$1:?Missing first argument
$ echo $foo
firstarg
【讨论】:
以上是关于$var?中bash变量参数扩展中的问号是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章