linux - 我不明白这个参数扩展 : ${p//[0-9]/}

标签 linux shell parameters expansion

在 Linux /etc/init.d/functions 脚本中,我发现了以下我不太理解的参数扩展:

${p//[0-9]/}  replace all instances of any number to/by what?

${1##[-+]}  This seems to remove all the longest left instances of minuses and pluses?

${LSB:-}  This seems to say that if LSB is not set then set nothing? in other words do nothing?

最佳答案

这些是 bash Shell Parameter Expansion 的实例; 见http://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html

注意:kshzsh 也支持您问题中的扩展(我不清楚功能重叠的全部范围),而 sh(POSIX-features-only shell),不支持字符串替换扩展,${p//[0-9]/>


${p//[0-9]/}

删除所有数字:用空字符串替换所有 (//) 数字实例 ([0-9]) - 即,它删除所有数字(最后一个 / 之后的是替换字符串,在本例中为空)。

${1##[-+]}

去除单个前导 -+(如果存在):从技术上讲,这会去除最长的前缀(##) 由来自参数 $1单个 -+ 字符组成。鉴于搜索模式仅匹配一个单个字符,因此无需为此处的最长前缀使用##,并且 # - 对于最短 前缀 - 可以。

${LSB:-} 

旨在防止脚本在使用 -u (nounset) shell 属性运行时中断的空操作:从技术上讲,这扩展意味着:如果变量 $LSB 未设置或为空,它将被替换为 :- 之后的字符串,其中,在这种情况下,也是空的。

虽然乍一看这似乎毫无意义,但它有其目的,如Sigi指出:


如果使用 -u 选项调用 shell(或使用 set -u),则 ${LSB:-} 结构非常有意义,并且变量 $LSB 实际上可能未设置。然后,如果您将 $LSB 引用为 ${LSB:-},则可以避免 shell 退出。由于在复杂脚本中使用 set -u 是一种很好的做法,因此此举经常派上用场。
"

关于linux - 我不明白这个参数扩展 : ${p//[0-9]/},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23319441/

相关文章:

linux - 使用 awk 排除无法正常工作的文件夹

linux - Bash并行进程模拟脚本

powershell - 如何在 native 不支持的powershell参数中使用通配符?

c - ftok 路径名与文件名

linux - 修复数据库时MongoDB "open files limit"错误

c - 用于区分 arm-none-eabi-gcc 和 gcc 的预定义宏

linux - 标准库 ABI 兼容性

linux - 我想用单独的文件夹存储最近 10 天的数据库备份

linux - 在 bash 中打印文件夹名称

参数的Oracle "IN clause"