shell基础概述

快捷查看指令 ctrl+f 进行搜索会直接定位到需要的知识点和命令讲解(如有不正确的地方欢迎各位小伙伴在评论区提意见,博主会及时修改)

shell测试

  • shell测试语法参数

    条件测试语法 说明
    test 测试表达式 test 与 测试表达式 之间至少要有一个空格
    [ 测试表达式 ] 用法与 test 一致,但是测试表达式左右两侧都必须有空格
    [[ 测试表达式 ]] 用法与 [ ] 一致, 双中括号是对单中括号的补充
    ((测试表达式)) 测试表达式左右两侧不需要空格
test条件测试

test命令评估表达式的依据是它的结果是真,还是假 ; 如果条件为真 那么 命令执行状态码的结果就是 0

若条件为假 执行状态码不为0 执行状态码获取 $?

if(条件为真){
	exit 0 ; 执行状态码为0
}else{
	exit 1; 条件为假 执行状态码不为0
}
文件类型参数
语法参数: ------ 判断文件类型
	-e 指定文件名是否存在    存在即为真 不存在 为假
	-f 指定文件名是否为文件
	-d 指定文件名是否为目录
	-b 指定的文件名是否为 block device装置
	-c 指定的文件名是否为 character device装置
	-S 指定的文件名是否为 Socket文件
	-p 指定文件名是否为一个FIFO文件
	-L 指定文件名是否为一个链接档
文件权限参数
参数介绍:
	-r 判断指定文件是都具备 读权限
	-w 判断指定文件是否具备 写权限
	-x 判断指定文件是否具备 执行权限
	-u 判断指定文件是否具备 SUID的属性
	-g 判断指定文件是否具备 SGID的属性
	-k 判断指定文件是否具备 Sticky bit的属性
	-s 判断指定文件是否为 非空白文件
		|- 真 是非空白文件   -----> 有内容
		|- 假 不是非空白文件 -----> 没有内容
案例:
[root@baizhi baizhi]# ll hello.sh
-rw-r--r--. 1 root root 18 11月 13 10:43 hello.sh
[root@bai bai]# test -w hello.sh
[root@bai bai]# echo $?
0
[root@bai bai]# test -x hello.sh
[root@bai bai]# echo $?
1
[root@bai bai]# test -s a.txt
[root@bai bai]# echo $?
1
[root@baizhi baizhi]# cat -E a.txt # 没有内容输出
文件比较参数
## 两个文件之间的比较
-nt (newer than) file1 -nt file2 判断 file1 是否比 file2 新
-ot (older than) file1 -ot file2 判断 file1 是否比 file2 旧
-ef file1 -ef file2 判断 file1 与 file2 是否为同一文件 可用于判断硬链接[判断这两个文件是否指向同一个inode ]
### -nt 参数的演示
案例测试数据:
50674120 -rw-r--r--. 2 root root 11 11月 15 10:34 file1_hard.txt
50674120 -rw-r--r--. 2 root root 11 11月 15 10:34 file1.txt
50674122 -rw-r--r--. 1 root root 0 11月 15 10:35 file2.txt

[root@bai bai]# test file1.txt -nt file2.txt
[root@bai bai]# echo $?
1
## -ot 参数的演示
[root@bai bai]# test file1.txt -ot file2.txt
[root@bai bai]# echo $?
0
## -ef 参数的演示
[root@bai bai]# test file1.txt -ef file2.txt
[root@bai bai]# echo $?
1
[root@bai bai]# test file1.txt -ef file1_hard.txt
[root@bai bai]# echo $?
0
整数之间的判定参数
## 关于两个整数之间的判定(针对变量数值大小的比较判断)
推荐是 [] 和 test使用比较的字符写法 因为使用 符号 > < != = >= <= 需要转义
	-eq 两数值相等
	-ne 两数值不等
	-gt num1 -gt num2 		num1 是否大于 num2
	-lt num1 -lt num2 		num1 是否小于 num2
	-ge num1 -ge num2 		num1 是否大于等于 num2
	-le num1 -le num2 		num1 是否小于等于 num2
判定字符串参数
-z
	test -z 字符串 判断字符串是否为空 "" 
		|- 若为空 则为真
		|- 若非空 则为假
-n
	test -n 字符串 判断字符串是否为 非空 ## -n 可以省略
		|- 若字符串是 非空 ------ 有内容 真
		|- 若字符串不是非空 ------ 没有内容 假
特例:
test str1 = str2 判断 str1 是否 等于 str2 若相等  true
test str1 != str2 判断 str1 是否和 str2 不等 不等为 true 相等为false
测试案例:
[root@bai bai]# test -z ""
[root@bai bai]# echo $?
0
[root@bai bai]# test -n ""
[root@bai bai]# echo $?
1
[root@bai bai]# test -z " "
[root@bai bai]# echo $?
1
多重条件判断
-a (and)两种情况同时成立 例如 test -r file1 -a -x file1 判断 file1是否具备读写权限,都具备返回真,
否则返回假
-o (or)两种情况任何一个成立 例如 test -r file1 -o -w file1 判断 file1 是否具备读权限或者写权限
若具备读或者写权限,则返回真
! 取反 例如  test ! -r file1 若file1具备读权限,则为假 反之为真
[root@bai bai]# test -r file1.txt -a -w file1.txt
[root@bai bai]# echo $?
0
[root@bai bai]# ll file1.txt
-rw-r--r--. 2 root root 11 11月 15 10:34 file1.txt
shell对于真假的判断逻辑。 提供了 && || !
A条件 && B条件
当A成立,才会执行B条件
A条件 || B条件
当A条件不成立时,才会执行B
中括号的条件测试

脚本中经常中括号进行条件测试 广泛应用 中括号[]

test 和 [] 作用一样

#注意: ​# 中括号 与表达式之间 前后空格必须有

### 注意事项
1. 在中括号中使用变量的值 "$变量名"
2. 中括号与测试表达式前后都要有空格
3. 若要进行比较,在中括号和 test 语句中使用 字符写法 ( -eq -ne -gt -lt -ge -le )
案例:
-rw-r--r--. 1 root root   0 11月 15 13:57 happy.txt  # hello.txt不存在
## 判断 hello.txt 是否存在  存在 输出 yes   不存在 输出 no
[root@centos-128 abc]# [ -e hello.txt ] && echo "yes" || echo "no"
no
## 判断 happy.txt 是否存在  存在 输出 yes   不存在 输出 no
[root@centos-128 abc]# [ -e happy.txt ] && echo "yes" || echo "no"
yes
## 判断 hello.txt 是否为文件  是文件 输出 yes   不是文件 输出 no
[root@centos-128 abc]# [ -f happy.txt ] && echo "yes" || echo "no"
yes
## 判断 /abc 是否为目录  是文件夹 输出 yes   不是文件夹 输出 no
[root@centos-128 abc]# [ -d /abc ] && echo "yes" || echo "no"
yes

测试数据:
[root@centos-128 abc]# a=1
[root@centos-128 abc]# b=2
[root@centos-128 abc]# c=3
[root@centos-128 abc]# d=1
[root@centos-128 abc]# [ "$a" -eq "$c" ] && echo "equal" || echo "no equal"
no equal
[root@centos-128 abc]# [ "$a" -gt "$c" ] && echo "a>c" || echo "a<=c"
a<=c
[root@centos-128 abc]# str4=""
[root@centos-128 abc]# [ -n "$str4" ] && echo "not kong" || echo "kong"
kong
[root@centos-128 abc]# str5="123"
[root@centos-128 abc]# [ -n "$str5" ] && echo "not kong" || echo "kong"
not kong
[root@centos-128 abc]# [ "$str5" ] && echo "not kong" || echo "kong"
not kong
[root@centos-128 abc]# [ "$str4" ] && echo "not kong" || echo "kong"
kong
双中括号的条件测试

对单中括号的补充: 双中括号中 还支持 正则处理 在双中括号中 不需要转义字符[可以识别特殊符号]

[[ 测试表达式 ]] 与 ((测试表达式)) 内部使用 比较字符 或者 比较符号 都可

工作中使用较多的是单中括号 双中括号属于特殊场景的扩展语法

案例:
[root@centos-128 abc]# file="/abc/happy.txt"
[root@centos-128 abc]# [[ (-r "$file" || -w "$file") && -x "$file"  ]] && echo "yes" || echo "no" #开辟一个子shell
no
[root@centos-128 abc]# [[ (-x "$file" || -w "$file") && -r "$file"  ]] && echo "yes" || echo "no" 
yes
逻辑判断符号
### 在 test 和 [] 内部使用的操作符
-a -o !
### 在 [[]] 和 (()) 内部使用的操作符
&& || !
测试数据:
[root@bai bai]# file1="/baizhi/a.txt" # 存在
[root@bai bai]# file2="/baizhi.txt"  # 不存在
[root@bai bai]# [ -e "$file1" -a -f "$file1" ] && echo "yes" || echo "no"
yes
[root@bai bai]# [ -e "$file2" -o -f "$file1" ] && echo "yes" || echo "no"
yes
## file2 中的 /baizhi.txt 不存在 无法判断 是否为文件 	假 -a 假 -----> 假
[root@bai bai]# [ -e "$file2" -a -f "$file2" ] && echo "yes" || echo "no"
no
## 真 -a !(假)			真 -a 真 -----> 真
[root@bai bai]# [ -e "$file1" -a ! -f "$file2" ] && echo "yes" || echo "no"
yes
## !(真) && 假 ------ 假 && 假 -----> 假
[root@bai bai]# [[ ! -e "$file1" && -f "$file2" ]] && echo "yes" || echo "no"
no
## !(子shell执行返回假) -----> 真 
[root@bai bai]# [[ ! (-e "$file1" && -f "$file2") ]] && echo "yes" || echo "no"
yes

你可能感兴趣的:(Linux,linux,运维)