Skip to content

bash 脚本基础

变量

bash 变量只有字符串这一种数据类型。bash 变量可以分为环境变量和自定义的变量。

sh
env
printenv # 等价 env

自定义变量:

sh
a=z                     # 变量 a 赋值为字符串 'z'
b="a string"            # 变量值包含空格,就必须放在引号里面
c="a string and $b"     # 变量值可以引用其他变量的值
e=$(ls -l foo.txt)      # 变量值可以是命令的执行结果
f=$((5 * 7))            # 变量值可以是数学运算的结果

也可以在前面加上 let:

  1. let命令声明变量时,可以直接执行算术表达式。
  2. let命令的参数表达式,可以包含空格。此时需要引号来引住。
sh
let foo=1+2 # foo=3
let "foo = 1 + 2" # foo=3

删除变量

sh
unset

导出变量

export 命令用于想子 Shell 输出变量;导出 Shell,新建子 Shell,将获得的他们的一份拷贝。

读取变量:$

这里,重要的是 $。Bash 将美元符号 $ 开头的 token 解析为变量,将其扩展成变量键对应的值:

  • $ 等价于 ${}, 表示取一个变量的值
  • ${!xxx}, 表示间接引用,即 tmp = ${xxx}; return ${tmp}
  • $(), 等价于 ``,表示取一个命令运行的结果
  • $(()), 表示在内部进行数学算术运算并得到结果。

特殊变量

参见 特殊变量

${} 的内部语法

Bash 提供四个特殊语法,跟变量的默认值有关,目的是保证变量不为空:

sh
${varname:-word}
${varname:=word}
${varname:+word}
${varname:?message}

算术运算

  • 算术运算 $(()) 内部支持所有的 C 运算;支持空格;支持嵌套;
  • 内部的字符串均被视为变量,如果变量的值不存在或者不是数字,那么将会被视为 0
  • $(()) 本身作为 bash 的命令的程序返回值取决于其运算结果,和直觉刚好相反。如果运算结果是 0 则返回 1,否则返回 0

字符串运算

长度

${#varname} 用于获取 varname 的长度。

字串提取运算

${varname:offset:length} 用于提取字串。varname 必须是合法变量。

改变大小写

sh
# 转为大写
${varname^^}

# 转为小写
${varname,,}

搜索和替换

declare 和 readonly

set