shell脚本中变量判断
# 前言
在linux中,通常我们所指的脚本编程,指的是bash的脚本编程。
bash作为一种过程式的编程语言来说,它应该具备编程语言所应该具备的基本元素,即:变量,流程,函数,数组。今天我们介绍变量以及流程之一的条件判断。
# 变量
# 初识变量
在编程语言中,编程语言有两大种,强类型语言和弱类型语言。
- 强类型语言中,要求变量的使用要严格符合定义,所有变量都必须先定义后使用。java、.NET、C++等都是强制类型定义的。
- 与其相对应的是弱类型语言:数据类型可以被忽略的语言。它与强类型定义语言相反, 一个变量可以赋不同数据类型的值。
常见的数据类型有:
- 数值型:×××,浮点型,布尔型
- 字符型:单字符,字符串
bash属于弱类型语言,其默认的变量类型为字符型。
# bash中的变量
我们知道,变量可以按其数据的类型进行划分,在bash中变量按其作用域的不同,也可以进行不同的划分。
- a) 局部变量:在bash脚本中,其作用域范围为局部性,比如想限制变量只在某函数中起作用
- b) 本地变量:在bash脚本中,其作用域范围为整个脚本,即脚本开始到结束
- c) 环境变量:系统工作使用的变量,常见的环境变量有,$PATH, $HOME, $PWD, 等等
- d) 位置参数变量:用于向脚本中传递参数
- e) 特殊变量:bash中预先定义好的具有特殊意义的比变量,如:$0, $1, $#, $@,….
# 变量的定义和使用
- a) 声明某变量为局部变量:local VAR_NAME=VALUE
- b) 声明某变量为本地变量:
- I) 不指定类型,默认类型为字符型 : VAR_NAEM=VALUE
- II) 定义数据类型为整数型:let VAR_NAME=VALUE 或 declare -i VAR_NAME=VALUE
- III) 声明某变量为环境变量:export VAR_NAME=VALUE 或 declare -x VAR_NAME=VALUE
# 语法部分
# 字符串判断【常用】
- str1 == str2 或者 str1 = str2 当两个串有相同内容、长度时为真;【两边要有空格】
- str1 != str2 当串str1和str2不等时为真
- -n str1 当串的长度大于0时为真(串非空)
- -z str1 当串的长度为0时为真(空串)
- str1 当串str1为非空时为真
# 数字的判断
- int1 -eq int2 两数相等为真
- int1 -ne int2 两数不等为真
- int1 -gt int2 int1大于int2为真
- int1 -ge int2 int1大于等于int2为真
- int1 -lt int2 int1小于int2为真
- int1 -le int2 int1小于等于int2为真
# 文件的判断
- -r file 用户可读为真
- -w file 用户可写为真
- -x file 判断文件是否具有执行权限
- -f file 判断所接的file是否为文件,是为真,否为假
- -d file 判断file是否为目录,是目录为真,否为假
- -c file 文件为字符特殊文件为真
- -b file 文件为块特殊文件为真
- -s file 文件大小非0时为真
- -t file 当文件描述符(默认为1)指定的设备为终端时为真
其他参数
- -e $file : 判断文件是否存在,存在为真
- -f $file: 判断文件是否存在,且为普通文件,满足条件为真
- -d $file: 判断是否存在且为为目录
- -b $file: 判断是否存在且为块设备
- -c $file: 判断是否存在且为字符设备
- -S $file: 判断是否存在且为套接字设备
- -p $file: 判断是否存在且为管道设备
- -L $file: 判断是否存在且为符号链接文件
- -r,w,x $file: 判断用户是否对此文件有读,写,执行权限
- -u,g,k $file: 判断文件是否拥有suid,sgid, sticky的权限
- -O,-G $file:判断当前用户是否为此文件的属主,属组
- -z 是否为空 为空则为真;
- -a 是否不空;
#if语句进行判断是否为空
[ "$name” = "" ]
#等同于
[ ! "$name" ]
[ -z "$name" ]
1
2
3
4
5
2
3
4
5
文件比较
- $file1 -nt $file2: (new than)判断文件1是否比文件2新
- $file1 -ot $file2: (old than)判断文件1是否比文件2新
- $file1 -et $file2: 判断文件1是和文件是否为同一个文件的硬链接
# 复杂逻辑判断/多条件表示
- -a 逻辑与:
if [ condition1 -a condition2 ]
或者if [ condition1 ] && [ condition2 ]
; - -o 逻辑或:
if [ condition1 -o condition2 ]
或者if [ condition1 ] || [ condition2 ]
; - ! 逻辑非(取反):
!
;
命令间的逻辑关系
逻辑与:&&
第一个条件为假 第二个条件不用在判断,最总结果已经有; 第一个条件为真,第二个条件必须得判断;
逻辑或:||
# Case when
linux中有和java中类似的case when条件;
1.条件xx)注意单括号
2.一个条件结束了用双的分号
#!/bin/bash
echo 'Input a number:'
read Num
case $Num in
1)
echo "You select 1"
;;
2)
echo "You select 2"
;;
3)
echo "You select 3"
;;
4|5)
echo "You select 4or5"
;;
*)
echo "default"
;;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 实践使用
# 字符串实践
# 数字实践
# 多条件
a=5
if [ $a -lt 1 ]; then
echo "<1"
elif [ $a -gt 100 ]; then
echo ">1"
elif [ $a -gt 1 ] && [ $a -lt 10 ]; then #注意 && 还是 || 必须[]分割开;
echo "ok"
else
echo "on ok"
fi
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# Case
for i in "$@"; do
case $i in
a | admin )
buildAdmin
;;
w | web)
buildWeb
;;
c | capacity)
buildCapacity
;;
f | files)
buildFiles
;;
*)
echo "项目命令不存在"
;;
esac
done
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 文件实践
上次更新: 2022/04/15, 05:41:30