Bash 中的参数扩展

经常容易忘,整理一下,记录下来

使用默认值

${parameter:-word}

如果 parameter 未定义或值为空,将返回 word 的扩展,否则返回 parameter 的值,parameter 本身的值不会变化。

 1 $ echo $a                    (1)
 2 
 3 $ echo ${a:-hello}           (2)
 4 hello
 5 $ echo $a
 6 
 7 $ a=hello                    (3)
 8 $ echo ${a:-world}           (4)
 9 hello
10 $ echo $a
11 hello
  1. 变量 a 未定义

  2. 变量 a 未定义,则返回 hello

  3. 变量 a 赋值

  4. 变量 a 有值且不为空,返回变量 a 本身

赋默认值

${parameter:=word}

如果 parameter 未定义或值为空,word 的扩展将赋予 parameter,表达式返回 parameter 的值。

 1 $ echo $b
 2 
 3 $ echo ${b:=hello}
 4 hello
 5 $ echo $b
 6 hello
 7 $ echo ${b:=world}
 8 hello
 9 $ echo $b
10 hello

如果未定义或值为空则显示错误

${parameter:?word}

如果 parameter 未定义或值为空,word 的扩展将写入到标准输出和标准错误

1 $ echo ${a:?empty parameter}
2 hello
3 $ echo ${c:?empty parameter}
4 -bash: c: empty parameter

使用可选值

${parameter:+word}

如果 parameter 未定义或非空,不会进行替换,否则将替换为 word 扩展后的值。

子字符串

  • ${parameter:offset}

  • ${parameter:offset:length}

返回 parameteroffset 指定的字符开始的 length 个字符,如果未指定 offset,则一直到最后。lengthoffset 是算术表达式。

 1 $ d=abcdefghijk
 2 $ echo ${d:4:3}
 3 efg
 4 $ echo ${d:4}
 5 efghijk
 6 $ echo ${d:4:100}
 7 efghijk
 8 $ echo ${d:4:0}
 9 
10 $ echo ${d:4:1}
11 e

如果 length 小于 0,则表示从 offset 开始到从结尾算 length 个偏移量的位置。

 1 $ echo ${d:4:-1}
 2 efghij
 3 $ echo ${d:4:-4}
 4 efg
 5 $ echo ${d:0:-4}
 6 abcdefg
 7 $ echo ${d:0:-4}
 8 abcdefg
 9 $ echo ${d:0:-5}
10 abcdef

通配

  • ${!prefix*}

  • ${!prefix@}

返回所有名称以 prefix 开始的变量名,以特殊变量 IFS 的第一个字符分隔。

1 $ echo ${!P*}
2 PATH PIPESTATUS PPID PS1 PS2 PS4 PWD
3 $ echo ${!H*}
4 HISTCMD HISTCONTROL HISTFILE HISTFILESIZE HISTSIZE HOME HOSTNAME HOSTTYPE

长度

${#parameter}

  • 如果 parameter 是字符串,返回字符串中字符的个数

  • 如果 parameter* 或者是 @, 返回位置参数的个数

  • 如果 parameter 是一个数组名,下标是 *`或者是 `@, 返回数组中元素的个数。

1 $ a=12345678
2 $ echo ${#a}
3 8
4 $ a=abcdefg
5 $ echo ${#a}
6 7

字符串首部删除

  • ${parameter#word}

  • ${parameter##word}

如果 word 匹配 parameter 的值的首部,返回从 parameter 首部删除 word 之后的值,第一种情况为最短匹配,第二种情况为最长匹配。

1 $ echo $e
2 abcabcabcefghij
3 $ echo ${e#*abc}
4 abcabcefghij
5 $ echo ${e##*abc}
6 efghij

字符串尾部删除

  • ${parameter%word}

  • ${parameter%%word}

如果 word 匹配 parameter 的值的尾部,返回从 parameter 尾部删除 word 之后的值,第一种情况为最短匹配,第二种情况为最长匹配。

1 $ echo $f
2 abcdefghighi
3 $ echo ${f%*ghi}
4 abcdefghi
5 $ echo ${f%%*(ghi)}
6 abcdef

字符串替换

  • ${parameter/pattern/string}

  • ${parameter//pattern/string}

parameter 被扩展,其值中最长的匹配 pattern 的内容被替换为 string。第一种形式中只有第一个匹配被替换,第二种形式中所有匹配都被替换。

  • 如果 pattern# 开始,它必须匹配 parameter 扩展后值的首部。

  • 如果 pattern% 开始,它必须匹配 parameter 扩展后值的尾部。

  • 如果 string 是空值,pattern 的匹配都将被删除, pattern 之后的 / 将被忽略

大小写转换

  • ${parameter^pattern}

  • ${parameter^^pattern}

  • ${parameter,pattern}

  • ${parameter,,pattern}

遍历 parameter 中的字符,如果与 pattern 匹配,则修改字符的大小写,pattern 不要一次匹配多个字符。

转换模式:

  • ^:小写字符转为大写字符

  • ,: 大写字符转为小写字符

转换次数:

  • ^^,, 转换所有匹配的字符

  • ^, 只转换第一个字符

如果没有提供 pattern,则视为 ?,即匹配任意的字符。

1 $ g=abcabcdefabcdefg
2 $ echo $g
3 abcabcdefabcdefg
4 $ echo ${g^a}
5 Abcabcdefabcdefg
6 $ echo ${g^^a}
7 AbcAbcdefAbcdefg

本文标题: Bash 中的参数扩展

本文链接: https://blog.zhustec.me/posts/parameter-expansion-in-bash

发布时间: 2018-07-21T10:53:10+00:00

版权声明: 本文由 zhustec 原创 采用 CC BY-NC-ND 4.0 许可协议 转载请保留以上声明信息!