1. 简介

BashShell 字符串内置许多字符串操作,包括有字符串切割、替换、分割等。

2. ${} 语法

2.1 字符串截取

举例来说:对于字符串 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

记忆方法:

1
2
3
# 是去掉左边(键盘上 # 在 $ 的左边)
% 是去掉右边(键盘上 % 在 $ 的右边)
单一符号是最小匹配;两个符号是最大匹配

2.2 子串提取、替换

对于字符串 file=/dir1/dir2/dir3/my.file.txt,还可以使用 ${} 语法来进行子串提取和替换:

  • ${file: start: length} 语法:
  • ${file: 0: 5}:提取最左边的 5 个字节:/dir1
  • ${file: 5: 5}:提取从左往右数第 5 个字节右边的连续 5 个字节:/dir2
  • ${file: 5}:提取第 5 个字节右边的所有字节:/dir2/dir3/my.file.txt
  • ${file: -8: 4}:提取从右往左数第 8 个字节右边的连续 4 个字节:file
  • ${file: -8}:提取从右往左数第 8 个字节右边的所有字节:file.txt
  • ${file/dir/path}:将第一个 dir 提换为 path/path1/dir2/dir3/my.file.txt
  • ${file//dir/path}:将全部 dir 提换为 path/path1/path2/path3/my.file.txt
  • `$