跳转到内容

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}

对于上述所有四个运算符,这会导致空变量与上述定义中未定义的变量以相同方式处理。

华夏公益教科书