2021-02-21 21:16:38
Linux ${} 表达式详解
在 Linux shell 编程中,${} 是一种用于参数替换、字符串操作、变量匹配、数组操作和正则匹配替换的强大工具。以下是该表达式的详细解释:
一、参数替换基本形式:${var_name} 等价于 $var_name,用于获取变量的值。
默认值替换:
${var:-default}:当 var 为空或未定义时,整个表达式的值为 default。
${var-default}:当且仅当 var 未定义时,整个表达式的值为 default。
赋值并替换:
${var:=default}:当 var 为空或未定义时,整个表达式的值为 default,并将 var 的值设置为 default。
${var=default}:当且仅当 var 未定义时,整个表达式的值为 default,并将 var 的值设置为 default。
错误检查:
${var:?message}:当 var 为空或未定义时,打印错误信息,信息内容为 message 表示的值。
${var?message}:当且仅当 var 未定义时,打印错误信息,信息内容为 message 表示的值。
条件替换:
${var:+default}:当 var 已定义且不为空时,整个表达式的值为 default。
${var+default}:当 var 已定义时,整个表达式的值为 default(不管 var 是否是空)。
从指定位置开始截取:
${str:offset}:从下标 offset(含)开始截取到末尾的子串。
从指定位置开始截取指定长度:
${str:offset:length}:从下标 offset(含)开始向后截取长度为 length 的子串,长度超出不报错。
从指定位置开始到指定索引截取:
${str:offset:index}:此处的 index 为负数,最后一个字符为 -1,依次往前为 -2, -3。此表达式截取 offset(含)到 index(不含)之间的子串,当 index 表示的位置在 offset 左边时会报错。
${!prefix*}、${!prefix@}:将带有前缀为 prefix 的变量名打印出来。
返回数组下标:
${!name[@]}、${!name[*]}:将数组 name 的所有下标返回,如果变量 name 不是数组则返回 0,不存在则空。
返回数组元素:
${name[@]}、${name[*]}:将数组 name 的所有元素返回,如果变量 name 不是数组则返回 name 的值,不存在则空。
返回指定索引的元素:
${name[index]}:将数组 name 的 index 处的元素返回,如果变量 name 不是数组且 index 为 0 时返回 name 的值,变量或索引 index 处的元素不存在则返回空。
从头开始匹配并过滤:
${parameter#word}、${parameter##word}:从头开始扫描 word,将匹配 word 正则表达式的字符过滤掉。# 为最短匹配,## 为最长匹配。
从尾开始匹配并过滤:
${parameter%word}、${parameter%%word}:从尾开始扫描 word,将匹配 word 正则表达式的字符过滤掉。% 为最短匹配,%% 为最长匹配。
替换匹配内容:
${parameter/pattern/string}:只替换一次匹配的内容。
${parameter//pattern/string}:全部替换匹配的内容。
假设我们定义了一个变量 file=/dir1/dir2/dir3/my.file.txt,可以用 ${} 分别替换得到不同的值:
此外,还可以对变量值里的字符串作替换,如 ${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 ${} 表达式的详细解释和示例。