内部变量
BASH:bash Shell的路径
BASH_SUBSHELL:shell的层次
BASH_VERSINFO:shell的版本信息
BASH_VERSION:bash Shell的版本
DIRSTACK:显示目录栈的栈顶值
1
2
3
4
5
6
7# 目录栈用于存放工作目录,便于程序员手动控制目录的切换,pushed和popd用来维护目录栈。
# pushed命令:用于将某目录压入目录栈,同时将当前工作目录切换到入栈的目录。
# popd命令:用于将栈顶目录弹出,下一个元素变为栈顶元素,同时将当前工作目录切换到栈弹出的目录。
pushed 目录名 # 将目录名压入目录栈,同时当前工作目录切换到目录,并输出栈的内容
popd # 将栈顶目录弹出,同时当前目录切换到栈弹出的目录,并输出栈的内容
dirs # 用于显示目录栈的所有内容
1 | pushd /home # /home |
GLOBIGNORE:由冒号分隔的模式列表,表示通配时忽略的文件名集合
1
# 一旦GLOBIGNORE非空,Shell会将通配得到的结果中符合GLOBIGNORE模式中的目录去掉。
GROUPS:当前用户所属的组群
HOSTNAME:记录了主机名
HOSTTYPE和MACHTYPE:记录系统的硬件架构
OSTYPE:记录操作系统类型
ERPLY:与read和select命令有关
1
2
3
4
5
6
7
8
9
10
11
12
13# read 将读到的标准输入存储到variable变量中。
read variable # 读取标准输入的变量值
# 当read命令不带任何变量名时,read就将读到的标准输入存储到REPLY变量中。
read
echo "$REPLY" # 存储未指定变量的用户输入
read name
echo "$name"
echo "$REPLY"
# input_reply
# input_name
# input_reply
1 | select var in "a" "b" "c" |
SECONDS:记录脚本从开始执行到结束所耗费的时间
SHELLOPTS:记录了处于“开”状态的Shell选项列表,是只读变量
1
2set -o optionname # 打开名为optionname选项
set +o optionname # 关闭名为optionname选项SHLVL:记录bash Shell嵌套的层次
1
2
3# 启动第一个shell,$SHLVL=1
# 如果在这个shell中执行脚本,则脚本的SHLVL为$SHLVL=2
# 依次类推TMOUT:设置Shell的过期时间,当TMOUT不为0时,Shell在TMOUT秒后自动注销
1
2
3TMOUT=3
read name # 如果用户在3秒内不输入信息,脚本将退出
echo "$name"
字符串处理
bash Shell提供了多种字符串处理的命令,如awk,expr。
- expr length:计算字符串长度
1
2${#string}
expr length "$string"
1 | string="a b c" |
- expr index:字符第一次出现的位置(索引)
1
2# 在$string上匹配$substring中字符第一次出现的位置,若匹配不到任何字符,expr index返回0
expr index $string $substring
1 | string="nihao a" |
- expr match:从开头开始匹配的字符个数
1
2# 从开头开始匹配,返回匹配的长度
expr match $string $substring # substring可以是字符串,也可以是正则表达式
1 | string="abc cba" |
- expr substr:抽取子串
1
2
3
4
5
6# ${...}命令:
${string:position} # 从0开始计数
${string:position:length}
# expr substr命令
expr substr $string $position $length # $length必不可少,从1开始计数
1 | string="abc def" |
- 删除子串
1
2
3
4
5
6
7# 从头删除子串
${string#substring} # 删除匹配的最短子串
${string##substring} # 删除匹配的最长子串
# 从结尾处删除子串
${string%substring} # 删除匹配的最短子串
${string%%substring} # 删除匹配的最长子串
1 | string="1234234" |
- 替换子串
1
2
3
4
5${string/substring/replacement} # 仅替换第一次匹配的子串
${string//substring/replacement} # 替换所有匹配的子串
${string/#substring/replacement} # 仅在开头处替换
${string/%substring/replacement} # 仅在结尾处替换
有类型变量
shell变量一般是无类型的,但是shell提供了declare和typeset两个命令用于指定变量的类型,这两个命令等价。
1 | declare [选项] 变量名 |
-r:设置为只读
1
2declare -r variable
readonly variable-i:将变量定义为整型(允许使用该变量进行算术运算)
1
2
3
4
5
6
7
8
9
10
11
12
13variable1=12
variable2="$variable1"+1
echo "$variable2" # 12+1
let variable3=$variable1+1
echo "$variable3" # 13
declare -i variable4 # 将variable4定义为整型变量
variable4="$variable1"+1
echo "$variable4" # 13
variable5=$((variable1+1)) # 双圆括号法(())执行运算
echo "$variable5" # 13-a:将变量声明为数组类型
-f:显示脚本之前定义过的所有函数名及其内容
1
2declare -f # 显示脚本之前定义过的所有函数名及其内容
declare -f function-name # 只显示function-name及其内容-F:只显示函数名,不显示内容
-x:将变量声明为环境变量
1
2
3# 相当于export命令
# declare -x 允许在声明变量为环境变量的同时给变量赋值,而export不支持此功能。
declare -x variable-name=value
间接变量引用
间接变量引用:一个变量引用另一个变量的值
1 | variable1=value |
bash数学运算
expr命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19expr ARG1 op ARG2
expr 3 | 2 # 3
expr 0 | 2 # 2,ARG1不为空且非零时,返回ARG1,否则返回ARG2
expr 3 & 2 # 3,ARG1不为空且非零时,返回ARG1,否则返回0
expr 0 & 2 # 0,ARG1不为空且非零时,返回ARG1,否则返回0
expr 1 > 2 # 0,假
expr 1 < 2 # 1,真
expr 1 >= 2 # 0
expr 1 <= 2 # 1
expr 1 = 2 # 0
expr 1 != 2 # 1
expr 1 + 2 # 3,运算符前后需要有空格
expr 2 - 1 # 1
expr 1 \* 2 # 2,*为元字符,需要转义
expr 2 / 1 # 2
expr 2 % 1 # 0bc运算器
是一种内建的运算器。
1 | bc # 直接输入bc,启动ba运算器 |
1 | # 在shell脚本中使用:命令替换和bc结合 |