我想知道 Linux 中以下两个参数替换选项之间的区别。
echo ${MESG:? "HI"}
echo ${MESG:- "HI"}
他们似乎都在做同样的事情。
答案1
从bash
手册(POSIX 标准有类似的措辞):
${parameter:-word}
:使用默认值。如果未设置或为 null,则替换parameter
的扩展。否则,将替换word
的值 。parameter
${parameter:?word}
:如果为空或未设置则显示错误。如果parameter
为 null 或未设置,则 的扩展word
(或者如果不存在则显示一条消息word
)将写入标准错误,并且 shell(如果不是交互式的)将退出。否则,parameter
将替换的值。
如果您的MESG
变量是非空字符串,它们会执行相同的操作(扩展到变量的值MESG
)。如果它为空或根本没有设置,则将${MESG:-HI}
被字符串替换HI
,并${MESG:?HI}
显示HI
标准错误并退出当前 shell 会话(除非它是交互式会话)。
答案2
如果未设置 MESG,则
echo ${MESG:?}
会打印
MESG: parameter null or not set
echo ${MESG:-}
会打印
<empty string>
这 ?并且 - 因此决定了如何处理 null 或未设置的变量