bash ${ } 变量替换用法总结

本文介绍Bash中变量的高级操作方法,包括字符串截取、替换、默认值设置等,同时也讲解了如何处理Bash数组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内容源自互联网===》http://unixboy.iteye.com/blog/499329


假设我们定义了一个变量为:

file=/dir1/dir2/dir3/my.file.txt

我们可以用 ${ } 分别替换获得不同的值:

  • ${file#*/}:拿掉第一条 / 及其左边的字串:dir1/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:0:5}:提取最左边的 5 个字?:/dir1
  • ${file:5:5}:提取第 5 个字右边的连续 5 个字:/dir2

我们也可以对变量值里的字串作替换:

  • ${file/dir/path}:将第一个 dir 提换为 path:/path1/dir2/dir3/my.file.txt
  • ${file//dir/path}:将全部 dir 提换为 path:/path1/path2/path3/my.file.txt

利用 ${ } 还可针对不同的变数状态赋值(没设定、空值、非空值):

  • ${file-my.file.txt} :假如 $file 为空值,则使用 my.file.txt 作默认值。(保留没设定及非空值)
  • ${file:-my.file.txt} :假如 $file 没有设定或为空值,则使用 my.file.txt 作默认值。 (保留非空值)
  • ${file+my.file.txt} :不管 $file 为何值,均使用 my.file.txt 作默认值。 (不保留任何值)
  • ${file:+my.file.txt} :除非 $file 为空值,否则使用 my.file.txt 作默认值。 (保留空值)
  • ${file=my.file.txt} :若 $file 没设定,则使用 my.file.txt 作默认值,同时将 $file 定义为非空值。 (保留空值及非空值)
  • ${file:=my.file.txt} :若 $file 没设定或为空值,则使用 my.file.txt 作默认值,同时将 $file 定义为非空值。 (保留非空值)
  • ${file?my.file.txt} :若 $file 没设定,则将 my.file.txt 输出至 STDERR。 (保留空值及非空值))
  • ${file:?my.file.txt} :若 $file 没设定或为空值,则将 my.file.txt 输出至 STDERR。 (保留非空值)

还有,${#var} 可计算出变量值的长度:

  • ${#file} 可得到 27 ,因为 /dir1/dir2/dir3/my.file.txt 刚好是 27 个字?...

接下来介绍一下  bash 的数组(array)处理方法:
一般而言,A="a b c def" 这样的变量只是将 $A 替换为一个单一的字串,
但是改为 A=(a b c def) ,则是将 $A 定义为数组。
bash 的数组替换方法可参考如下方法:

  • ${A[@]} 或 ${A[*]} 可得到 a b c def (全部数组)
  • ${A[0]} 可得到 a (第一个数组),${A[1]} 则为第二个数组...
  • ${#A[@]} 或 ${#A[*]} 可得到 4 (全部数组数量)
  • ${#A[0]} 可得到 1 (即第一个数组(a)的长度),${A[3]} 可得到 3 (第一个数组(def)的长度)
  • A[3]=xyz 则是将第 4 个数组重新定义为 xyz ...

一句话总结:bash 很强大!


在 Linux Shell 脚本中,`$变量` 是一种用于访问变量值的语法形式。Shell 中的变量本质上是存储数据的标识符,可以通过 `$变量名` 或 `${变量名}` 的方式引用其内容[^1]。 ### 变量的基本使用 定义一个变量非常简单,只需指定变量名并赋予一个值即可: ```bash name="Linux" ``` 随后可以使用 `$name` 或 `${name}` 来引用该变量的内容: ```bash echo $name # 输出: Linux ``` `${变量名}` 这种写法在需要将变量名与其它字符区分开来时特别有用,例如在字符串拼接中: ```bash echo "Hello, ${name}User" # 输出: Hello, LinuxUser ``` ### 特殊变量和符号 除了用户自定义的变量外,还有一些预定义的特殊变量和符号,它们具有特定用途: - **`$0`**:表示当前执行的脚本名称(包括完整路径)。 - **`$1` 到 `$9`**:表示传递给脚本的参数,每个数字对应一个位置参数。 - **`$#`**:表示传递给脚本的参数个数。 - **`$*` 和 `$@`**:两者都表示所有传递给脚本的参数列表。但 `"$*"` 会将所有参数视为单个字符串,而 `"$@"` 会保留每个参数作为独立字符串。 - **`$$`**:表示当前脚本运行的进程 ID (PID)。 - **`$!`**:表示后台运行的最后一个进程的 PID。 - **`$?`**:表示上一条命令的退出状态码,0 表示成功,非零值通常表示错误。 - **`$-`**:显示当前 shell 使用的选项标志。 ### 命令替换与表达式求值 `$()` 是一种命令替换机制,允许将某个命令的输出结果赋值给变量,等价于反引号 `` `command` ``,但更易读且支持嵌套: ```bash current_date=$(date) echo "Current date is: $current_date" ``` 此外,还可以使用 `$(( ... ))` 对数学表达式进行求值: ```bash result=$((5 + 3)) echo "Result of 5+3 is: $result" ``` ### 示例代码 下面是一个综合示例脚本,演示了上述各种变量用法: ```bash #!/bin/bash # 用户定义变量 greeting="Hello" name="World" # 引用用户定义变量 echo "$greeting, ${name}!" # 接收命令行参数 script_name=$0 first_arg=$1 second_arg=$2 total_args=$# # 显示相关信息 echo "Script name: $script_name" echo "First argument: $first_arg" echo "Second argument: $second_arg" echo "Total arguments: $total_args" # 获取当前进程ID和最后后台进程ID current_pid=$$ last_background_pid=$! echo "Current process ID: $current_pid" echo "Last background process ID: $last_background_pid" # 执行命令替换 current_time=$(date +"%H:%M:%S") echo "Current time is: $current_time" # 数学运算 sum=$((3 + 5)) echo "Sum of 3 + 5 is: $sum" # 检查上条命令是否成功 exit_status=$? echo "Exit status of last command: $exit_status" ``` 运行此脚本时,可以传入两个参数以观察不同变量的行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值