我相信格伦杰克曼已经明白了,但我想详细说明一下,不适合发表评论。
Shell 脚本不以表达式为导向。它们以命令和文字为导向。Shell 变量默认是字符串(在原始的 Bourne shell 中,无法创建任何其他类型的变量)。作业的 RHS 不是您认为的“表达式”,即使您希望它们是,您的b
and也不是“表达式”。c
基本的赋值语法是
var=string
右手边只是一个字符串。Shell 提供了几种可用于构建字符串的扩展,这使得可以执行以下操作
var1=string
var2=$var1
var3="This is a ${var1}"
var4=$(ls | wc -l)
var5=$(($var4 + 1))
分配给每个变量的值是 RHS 上的字符串,其中$
执行了一些扩展(用 标记)。
最后一个例子 with$((...))
是唯一真正包含可以称为“表达式”的东西的例子。双括号扩展适用于算术表达式,因此如果您的b
andc
是数字,这将是使用的东西。
b
因此,您应该停止考虑使用两个子表达式和作为输入来评估表达式的期望结果c
,因为这些概念在 shell 语言中并没有以这种方式概括。
如果b
是一个变量,并且您想使用未设置变量时使用的默认值来扩展它,则使用${b-c}
. 如果您还希望在设置变量但为空时使用默认值,则使用${b:-c}
. 这些示例中的thec
是一个字符串,并且与 shell 中的所有其他字符串一样,它可以通过扩展构建:
i=3
var=""
echo ${var:-$(cat somefile)} # since var is empty, substitute file contents
echo ${var:-$(($i * $i))} # since var is empty, do some math instead
现在,如果你b
的不是一个变量$var
,你可能会发现以上都不适用!因为${...:-...}
语法是用于变量扩展的。你真的必须指定是什么b
,你不能说“表达式”,因为在 shell 中没有这样的东西。