linux ${}表达式详解

linux ${}表达式详解
最新回答
视而不见

2021-02-21 21:16:38

Linux ${} 表达式详解

在 Linux shell 编程中,${} 是一种用于参数替换、字符串操作、变量匹配、数组操作和正则匹配替换的强大工具。以下是该表达式的详细解释:

一、参数替换
  1. 基本形式:${var_name} 等价于 $var_name,用于获取变量的值。

  2. 默认值替换

    ${var:-default}:当 var 为空或未定义时,整个表达式的值为 default。

    ${var-default}:当且仅当 var 未定义时,整个表达式的值为 default。

  3. 赋值并替换

    ${var:=default}:当 var 为空或未定义时,整个表达式的值为 default,并将 var 的值设置为 default。

    ${var=default}:当且仅当 var 未定义时,整个表达式的值为 default,并将 var 的值设置为 default。

  4. 错误检查

    ${var:?message}:当 var 为空或未定义时,打印错误信息,信息内容为 message 表示的值。

    ${var?message}:当且仅当 var 未定义时,打印错误信息,信息内容为 message 表示的值。

  5. 条件替换

    ${var:+default}:当 var 已定义且不为空时,整个表达式的值为 default。

    ${var+default}:当 var 已定义时,整个表达式的值为 default(不管 var 是否是空)。

二、字符串截取
  1. 从指定位置开始截取

    ${str:offset}:从下标 offset(含)开始截取到末尾的子串。

  2. 从指定位置开始截取指定长度

    ${str:offset:length}:从下标 offset(含)开始向后截取长度为 length 的子串,长度超出不报错。

  3. 从指定位置开始到指定索引截取

    ${str:offset:index}:此处的 index 为负数,最后一个字符为 -1,依次往前为 -2, -3。此表达式截取 offset(含)到 index(不含)之间的子串,当 index 表示的位置在 offset 左边时会报错。

三、变量匹配
  1. 匹配带有前缀的变量名

    ${!prefix*}、${!prefix@}:将带有前缀为 prefix 的变量名打印出来。

四、数组操作
  1. 返回数组下标

    ${!name[@]}、${!name[*]}:将数组 name 的所有下标返回,如果变量 name 不是数组则返回 0,不存在则空。

  2. 返回数组元素

    ${name[@]}、${name[*]}:将数组 name 的所有元素返回,如果变量 name 不是数组则返回 name 的值,不存在则空。

  3. 返回指定索引的元素

    ${name[index]}:将数组 name 的 index 处的元素返回,如果变量 name 不是数组且 index 为 0 时返回 name 的值,变量或索引 index 处的元素不存在则返回空。

五、正则匹配替换
  1. 从头开始匹配并过滤

    ${parameter#word}、${parameter##word}:从头开始扫描 word,将匹配 word 正则表达式的字符过滤掉。# 为最短匹配,## 为最长匹配。

  2. 从尾开始匹配并过滤

    ${parameter%word}、${parameter%%word}:从尾开始扫描 word,将匹配 word 正则表达式的字符过滤掉。% 为最短匹配,%% 为最长匹配。

  3. 替换匹配内容

    ${parameter/pattern/string}:只替换一次匹配的内容。

    ${parameter//pattern/string}:全部替换匹配的内容。

示例

假设我们定义了一个变量 file=/dir1/dir2/dir3/my.file.txt,可以用 ${} 分别替换得到不同的值:

  • ${file#*/}:删掉第一个 / 及其左边的字符串,结果为 dir1/dir2/dir3/my.file.txt(注意这里描述有误,应为 dir2/dir3/my.file.txt)。
  • ${file##*/}:删掉最后一个 / 及其左边的字符串,结果为 my.file.txt。
  • ${file#*.}:删掉第一个 . 及其左边的字符串,结果为 file.txt。
  • ${file##*.}:删掉最后一个 . 及其左边的字符串,结果为 txt。
  • ${file%/*}:删掉最后一个 / 及其右边的字符串,结果为 /dir1/dir2/dir3。
  • ${file%%/*}:删掉第一个 / 及其右边的字符串,结果为空值(注意这里描述有误,应为空字符串,但通常不会单独使用此形式)。
  • ${file%.*}:删掉最后一个 . 及其右边的字符串,结果为 /dir1/dir2/dir3/my.file。
  • ${file%%.*}:删掉第一个 . 及其右边的字符串,结果为 /dir1/dir2/dir3/my。

此外,还可以对变量值里的字符串作替换,如 ${file/dir/path} 将第一个 dir 替换为 path,结果为 /path1/dir2/dir3/my.file.txt。

利用 ${} 还可针对不同的变量状态赋值,如 ${file-my.file.txt} 表示如果 $file 没有设定,则使用 my.file.txt 作为返回值。

最后,${#var} 可计算出变量值的长度,如 ${#file} 可得到 27,因为 /dir1/dir2/dir3/my.file.txt 是 27 个字符。

以上就是 Linux ${} 表达式的详细解释和示例。