Bash 变量本质上都是字符串,只是在特定的上下文中尝试将这些字符串解释为其他类型(如整数、数组)。这是一种“弱类型”或“无类型”的表现。。
Bash 中使用一些字符表示特殊含义,例如:
# - 表示数值
$ - 表示读取变量的值
& - 表示将命令放在后台执行
...
如果要表示这个特殊字符本身,则需要使用 \ 进行转义。例如:
\\ 表示 \ 字符本身
\# 表示 # 字符本身,而非注释
\$ 表示 $ 字符本身,而非变量读取
\& 表示 & 字符本身,而非将命令放在后台执行
\" 用在双引号包裹的字符串内部,表示 " 自身,而非字符串结束
\' 用在单引号包裹的字符串内部,表示 ' 自身,而非字符串结束
除此之外,一些不可打印的字符也使用转义字符表示。例如:
| 字符 | 说明 |
|---|---|
\n |
换行 |
\r |
回车 |
\t |
制表符 |
\b |
退格 |
当文本包含空格时,就需要使用引号防止单词分割。例如:
$ MSG="Hello World"
$ echo $MSG
Hello World
"Hello World" 是一个字符串整体
在双引号内部,用于 生成文本 的特殊字符仍然有效。例如:
$ echo "当前 Shell 是 $SHELL" # $SHELL 仍旧读取变量的值
当前 Shell 是 /bin/bash
双引号内部的其它特殊字符将失去效果,表示其字面含义。例如:
$ echo "我可以用 > 或者 | 吗?" # >,|,? 都只表示文本本身,不再表示特殊字符
我可以用 > 或者 | 吗?
单引号除了避免分割单词之外,还让所有特殊字符都失去效果,表示其字面含义。例如:
$ echo '当前 Shell 是 $SHELL' # $ 仅表示 $ 字符本身
当前 Shell 是 $SHELL
获取字符串长度的语法为:
${#变量名}
花括号({})是必须的,否则 $# 会被视为特殊变量:当前命令的参数数量
例如:
$ VAR="Hello World"
$ echo ${#VAR}
11
大小写转换的语法为:
# 转换为大写
${变量名^^}
# 转换为小写
${变量名,,}
例如:
$ VAR="Hello World"
$ echo ${VAR^^}
HELLO WORLD
$ echo ${VAR,,}
hello world
从字符串中切片子字符串的语法为:
${变量名:偏移:长度}
偏移 是子字符串的起始位置,从 0 开始
长度 是子字符串的长度;可以省略,即直到字符串末尾
例如:
例如:
$ VAR="Hello World"
$ echo ${VAR:0:5}
Hello
$ echo ${VAR:3:5}
lo Wo
$ echo ${VAR:6}
World
Bash 提供字符串搜索和替换的多种方法,
头部搜索替换的语法为:
${变量名#搜索模式} # 删除头部匹配(懒惰模式)
${变量名##搜索模式} # 删除头部匹配(贪婪模式)
${变量名/#搜索模式/替换字符串} # 用替换字符串替换头部匹配(贪婪模式)
例如:
$ VAR="Hello World"
$ echo ${VAR#H*o} # 删除头部最短的 H*o
World
$ echo ${VAR##H*o} # 删除头部最长的 H*o
rld
$ echo ${VAR/#H*o/See} # 将头部最长的 H*o 替换为 See
Seerld
尾部搜索替换的语法为:
${变量名%搜索模式} # 删除尾部匹配(懒惰模式)
${变量名%%搜索模式} # 删除尾部匹配(贪婪模式)
${变量名/%%搜索模式/替换字符串} # 用替换字符串替换尾部匹配(贪婪模式)
例如:
$ VAR="Hello World"
$ echo ${VAR%o*d} # 删除尾部最短的 H*o
Hello W
$ echo ${VAR%%o*d} # 删除尾部最长的 H*o
Hell
$ echo ${VAR/%o*d/Today} # 将尾部最长的 H*o 替换为 Today
HellToday
全文搜索替换的语法为:
${变量名/搜索模式/替换字符串} # 用替换字符串替换第一个全文匹配(贪婪模式)
${变量名//搜索模式/替换字符串} # 用替换字符串替换全部全文匹配(贪婪模式)
例如:
$ VAR="吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮。"
$ echo ${VAR/葡萄/香蕉} # 用香蕉替换第一个葡萄
吃香蕉不吐葡萄皮,不吃葡萄倒吐葡萄皮。
$ echo ${VAR//葡萄/香蕉} # 用香蕉替换所有葡萄
吃香蕉不吐香蕉皮,不吃香蕉倒吐香蕉皮。