Bash脚本编程(2)——编程入门
@(Bash)[编程入门]
1. Bash中的变量
1.1 变量类型
- 字符型
- 数值型
- 整型
- 浮点型
语言类型:
-
强类型:
定义变量时必须指定类型、参与运算必须符合类型要求;
调用未声明变量会产生错误; -
弱类型:
无须指定类型,默认均为字符型;
参与运算会自动进行隐式类型转换;
变量无须事先定义可直接调用;
1.2 变量的种类
(1)本地变量
生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效;
(2)环境变量
生效范围为当前shell进程及其子进程;
(3)局部变量
生效范围为当前shell进程中某代码片断(通常指函数);
(4)位置变量
$1
, $2
, ...来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数;
(5)特殊变量
$?
, $0
, $*
, $@
, $#
1.3 本地变量
变量赋值:name='value'
(1) 可以是直接字串:name="username"
(2) 变量引用:name="$username"
(3) 命令引用:name=COMMAND
, name=$(COMMAND)
变量引用:
${name}
, $name
引用分类:
""
:弱引用,其中的变量引用会被替换为变量值;
''
:强引用,其中的变量引用不会被替换为变量值,而保持原字符串;
显示已定义的所有变量:
set
销毁变量:
unset name
1.4 环境变量
变量声明、赋值:
export name=VALUE
declare -x name=VALUE
只读变量:
readonly name
declare -r name
变量引用:
$name
, ${name}
显示所有环境变量:
export
env
printenv
销毁:
unset name
变量命名法则:
(1) 不能使程序中的保留字:例如if, for
(2) 只能使用数字、字母及下划线,且不能以数字开头
(3) 见名知义
1.5 位置变量
在脚本代码中调用通过命令行传递给脚本的参数
$1
,$2
, ...:对应调用第1、第2等参数
$0
: 命令本身
shift [n]
用来偏移未知变量的一个命令
1.6 特殊变量
-
$?
判断上一个命令或脚本的执行成功与否 -
$*
传递给脚本的所有参数; -
$@
传递给脚本的所有参数; -
$#
传递给脚本的参数的个数;
2. Bash的配置文件
2.1 按生效范围划分
全局配置:
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
个人配置:
~/.bash_profile
~/.bashrc
2.2 按功能划分
profile类:为交互式登录的shell提供配置
- 全局:
/etc/profile
/etc/profile.d/*.sh
- 个人:
~/.bash_profile
- 功用:
(1) 用于定义环境变量
(2) 运行命令或脚本
bashrc类:为非交互式登录的shell提供配置
- 全局:
/etc/bashrc
- 个人:
~/.bashrc
- 功用:
(1) 定义命令别名
(2) 定义本地变量
2.3 生效次序
交互式登录(shell登录):
- 直接通过终端输入账号密码登录;
- 使用
su - UserName
或su -l UserName
切换的用户 - 生效次序
/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
非交互式登录(shell登录):
- su UserName
- 图形界面下打开的终端
- 执行脚本
- 生效次序
~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh
3. Bash中的运算
3.1 基本算数运算
算术符号:
+
-
*
/
%
**
实现算术运算:
(1) let var=算术表达式
(2) var=$[算术表达式]
(3) var=$((算术表达式))
(4) var=$(expr arg1 arg2 arg3 ...)
乘法符号有些场景中需要转义
Bash有内建的随机数生成器:$RANDOM
3.2 增强型赋值
算术符号:
+=
-=
*=
/=
%=
实现算术运算:
let varOPERvalue
例如:let count+=1
3.3 自增、自减
自增:
let var+=1
let var++
自减:
let var-=1
let var--
4. 条件测试
4.1 测试命令
test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]
Note: EXPRESSION前后必须有空白字符
4.2 数值测试
-
-gt
是否大于 -
-ge
是否大于等于 -
-eq
是否等于 -
-ne
是否不等于 -
-lt
是否小于 -
-le
是否小于等于
4.3 字符串测试
-
==
是否等于 -
>
是否大于
-
<
是否小于 -
!=
是否不等于 -
=~
左侧字符串是否能够被右侧的PATTERN所匹配
此表达式一般用于[[ ]]中 -
-z "STRING"
测试字符串是否为空,空则为真,不空则为假 -
-n "STRING"
测试字符串是否不空,不空则为真,空则为假
Note:用于字符串比较时的用到的操作数都应该使用引号
4.4 文件测试
4.4.1 存在性测试
-
-a FILE
文件存在性测试,存在为假,否则为真 -
-e FILE
文件存在性测试,存在为真,否则为假
4.4.2 存在性及类别测试
-
-b FILE
是否存在且为块设备文件 -
-c FILE
是否存在且为字符设备文件 -
-d FILE
是否存在且为目录文件 -
-f FILE
是否存在且为普通文件 -
-h FILE
或-L FILE
存在且为符号链接文件 -
-p FILE
是否存在且为命名管道文件 -
-S FILE
是否存在且为套接字文件
4.4.3 文件权限测试
-
-r FILE
是否存在且可读 -
-w FILE
是否存在且可写 -
-x FILE
是否存在且可执行
4.4.4 文件特殊权限测试
-
-g FILE
是否存在且拥有sgid权限 -
-u FILE
是否存在且拥有suid权限 -
-k FILE
是否存在且拥有sticky权限
4.4.5 文件大小测试
-
-s FILE
是否存且非空
4.4.6 文件是否打开
-
-t fd
fd表示文件描述符是否已经打开且与某终端相关 -
-N FILE
文件自动上一次被读取之后是否被修改过 -
-O FILE
当前有效用户是否为文件属主 -
-G FILE
当前有效用户是否为文件属组
4.4.7 双目测试
-
FILE1 -ef FILE2
FILE1与FILE2是否指向同一个设备上的相同inode -
FILE1 -nt FILE2
FILE1是否新于FILE2 -
FILE1 -ot FILE2
FILE1是否旧于FILE2
4.5 组合测试条件
第一种方式:
COMMAND1 && COMMAND2
COMMAND1 || COMMAND2
! COMMAND
举例:
1、[ -e FILE ] && [ -r FILE ]
第二种方式:
EXPRESSION1 -a EXPRESSION2
EXPRESSION1 -o EXPRESSION2
! EXPRESSION
举例:
1、[ -z "$hostName" -o "$hostName"=="localhost.localdomain" ] && hostname www.magedu.com
2、[ -f /bin/cat -a -x /bin/cat ] && cat /etc/fstab
必须使用测试命令进行