博客
关于我
Linux Shell之三 高级变量及字符串
阅读量:791 次
发布时间:2023-02-01

本文共 2073 字,大约阅读时间需要 6 分钟。

Bash Shell 变量扩展与运算指南

1. 变量扩展

Bash Shell中的变量扩展功能强大,主要包括以下三种扩展形式:

1.1 变量扩展

基本形式

${变量名称}

扩展形式

${filename}

示例

a=yangb=${a-'hello'}echo $b  # 输出:yang

说明

  • 当变量存在且不为空时,保留变量原值。
  • 当变量不存在或为空时,使用默认值。
  • 用双引号包围变量名称以支持对空值的检测。

1.2 命令替换

基本形式

$(命令)

扩展形式

$((算术式))

示例

echo $(ls /)  # 列出的目录内容n=5; echo $n  # 输出:5

说明

  • 使用反引号包围命令将输出结果赋值给变量。
  • 直接使用美元符号可实现同样的效果。

1.3 算术扩展

基本形式

$((算术式))

复杂实现

a=3+4; echo $((a))  # 输出:7

说明

  • 在变量中直接嵌入算术表达式,结果作为变量值输出。
  • Bash会将变量视为字符字符串,需谨慎处理非数字运算。

2. 字符串操作

2.1 取字符串切片

基本形式

${变量:起始位置}${变量:起始位置:长度}

示例

a="hello,world"b=${a:3}  # 输出:lo,worldc=${a:3:5}  # 输出:lo,wo

说明

  • 起始位置从0开始计数。
  • 假设未指定长度,默认至末尾。

2.2 取部分位置参数

基本形式

${变量@n}${变量:m:n}

示例

echo ${0:2}  # 输出:nt./script.sh 12 23 34 45  # 输出:23 34 45

说明

  • ${@:2}取出命令参数的第二个及以后的所有参数。
  • ${@:2:4}取出第二个及后四个参数。

2.3 计算字符串长度

基本形式

${变量名称}

示例

a="root:x:0:0:root:/root:/bin/bash"echo ${#a}  # 输出:22

说明

  • 使用 ${#变量} 计算字符串的长度。

3. 字符串替换与删除

3.1 替换或删除部分字符串

基本形式

${变量/旧值/新值}${变量/旧值//新值}

示例

a="root:x:0:0:root:/root:/bin/bash"b=${a/:/}  # 替换所有 `:` 为空格b=${a/%s/}  # 删除最后一个字符 `s`

说明

  • 使用 / 进行替换,% 进行删除。
  • 吃引号可以转义特殊字符。

3.2 删最短或最长匹配的字符串

基本形式

${变量#样式}${变量##样式}${变量%样式}${变量%%样式}

示例

a="/usr/sbin/ntpdate"b=${a#/*/}  # 删除最短匹配的路径部分,最终为 `sbin/ntpdate`c=${a##/*/}  # 删除最长匹配的路径部分,最终为 `usr/sbin`

说明

  • # 为从左到右,% 为从右到左查找匹配项。

4. 变量引用与替换

4.1 双引号的作用

基本功能

  • 支持变量引用。
  • 支持转义特殊字符。

示例

echo "$PWD"  # 输出当前工作目录echo "\$PWD"  # 输出 `$PWD`echo '`date`'  # 执行 date 命令并输出结果

说明

  • 单引号适用于不含变量的字符串。
  • 反引号用于执行内部命令。

4.2 变量默认值与强制引用

基本形式

${变量:默认值}

示例

a=yangb=${a:-'hello'}  # 当 a 存在且为空时,b 取默认值 `hello`c=${a:='hello'}  # 当 a 存在且为空时,c 取默认值 `hello` 并警告 a 为空值

说明

  • :-: 区别在于,: 会将 a 设为空值,默认值成员。

4.3 变量存在性检测

基本形式

${变量:+真值}

示例

a=123b=${a:+'true'}  # 当 a 存在且不为空,b 为 `true`;否则空

说明

  • 通过以 + 开头的变量引用强制检验变量存在性。

5. 数组操作

5.1 获取数组元素

基本形式

${!元素[@]}${!元素[*]}

示例

a=(one two three)for i in ${!a[@]} do  echo $idone

说明

  • ${!a[@]}${!a[*]} 用于遍历数组元素。

5.2 提取数组索引列表

基本形式

echo ${!数组变量[@]}

示例

a=(one two three)for i in ${!a[@]} do  echo "第$i个元素:$a[$i]"done

说明

  • ${!a[@]} 提取数组变量的索引列表。

6. 技术总结

在编写脚本时,需注意以下几点:

  • 使用双引号包围包含变量的字符串。
  • 反引号适用于执行内部命令。
  • 单引号仅用于简单字符串,不支持变量引用。
  • 在比较和逻辑条件中,确保变量引用正确。

通过合理运用这些功能,可以大幅提升Shell脚本的可读性和功能性。

转载地址:http://wiwfk.baihongyu.com/

你可能感兴趣的文章
linux 上定时任务执行shell脚本
查看>>
Linux 上查看和刷新 DNS 缓存
查看>>
Linux 上的 dig 和 nslookup 命令
查看>>
linux 下 php 安装 libevent
查看>>
Linux 下 `/etc/limits.conf` 文件中的配置详解:`* soft nofile 65535` 和 `* hard nofile 65535` 以及 `* soft nproc
查看>>
Linux 下DNS详解
查看>>