Shell 编程/扩展
扩展是将值传递给脚本所必需的。我们将在这里讨论算术扩展和参数扩展。在变量之前放置 '$' 将扩展其值。
算术扩展不是 可移植 shell 语法 的一部分,但作为 POSIX 扩展添加。算术扩展使用 $((operation)) 结构实现。参数扩展通过使用 ${parameter} 结构实现。
让我们举一个算术扩展的例子
one=1 $(($one+1))
$(($one+1)) 将具有值为 2。
让我们尝试对参数扩展进行一些示例。假设我们想从 'HelloBob' 中删除字符串 'Hello'。以下操作将实现此目的
string='HelloBob' ${string%Bob}
${string%Bob} 部分从变量 string 的末尾删除 'Bob',因此我们剩下 Hello 作为输出。
如果变量 string 的值为 'HelloBobBob',${string%%Bob*} 将执行相同的操作。'%%' 部分是必需的,因为它表示删除与 'Bob*' 匹配的最长模式。所以,我们也剩下 'Hello'。
如果将 '%' 替换为 '#',将 '%%' 替换为 '##',则这表示相同的含义,但这次是从参数的开头,而不是从结尾。例如,以下代码将从 'HelloBobBob' 中删除 'Hello'
${string#Hello}
以下小节代表了一种处理情况的语法,其中变量可能未定义。
${param-value}
如果 param 的原始值为 null,则使用 'value',否则使用param 变量的值。
${param?value}
如果定义了 param,则使用 param,否则将 value 打印到输出 - 它实际上中止了命令。
${param+value}
如果定义了 param,则使用 'value'(否则为空字符串)。
${param=value}
如果 param 未定义,则使用 'value' 并将 param 设置为 'value'。
除了上述语法之外,还有一种在-/?/+/= 前面有冒号的语法,例如
${param:?Parameter param must be set and non-empty}
对于上述所有四个运算符,这会导致空变量与上述定义中未定义的变量以相同方式处理。