文章目录
- 一、变量基础
- 二、bash变量类型
- 三、脚本基础知识
- 3.1 脚本测试命令
- 3.2 shell运算符
- 3.3 命令逻辑关系
- 3.4 bash条件判断
- 3.4.1 条件测试的表达式
- 3.4.2 整数测试
- 3.4.2 字符测试
- 3.4.3 文件测试
- 3.4.4 组合测试条件
一、变量基础
变量的含义:
- 变量可以通过变量名访问,变量通常是可以变化的量。
定义变量要求:
- 只能包含字母、数字、下划线,并且不能以数字开头。
- 不应该跟系统中已有的环境变量重名,尽量不要全部使用大写,尽量不要用“_”下划线开头。
- 不能使用程序中的保留字,也就是shell内置的一些语法,例如if、for等。
变量类型:
- 字符型:字符串类型。
- 数值型: 整数型和浮点型。
- 布尔型:True和False。
变量操作:
- 设置变量:例如,a=10。
- 引用变量:例如,echo $a
- 撤销变量:例如,unset a
变量和单引号、双引号的关系:
- 单引号表示变量本身。
- 双引号表示变量值。
二、bash变量类型
- 本地变量:作用域为当前shell进程。对当前shell外的其它shell进程,包括当前shell的父shell、子shell进程均无效,只能当前有效。
- 局部变量:在本地变量前面加个local,代表作用域为当前代码段,常用于函数,例如 local qingjun=10
- 环境变量:作用域为当前shell进程及其子进程,使用export定义。
- 位置变量:用来引用脚本的参数。
- 常用语句shift [num],多用于for循环,表示位置变量使用完以后退出,后面的参数向前推进。
- 特殊变量:
- $#:打印传给脚本参数的个数。
- $0:打印脚本本身名字。
- $@:打印传给脚本的所有参数的列表,单独个体存放,一个一个取。
- $*:打印以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个,当成一个整体存放,再一个一个取。
- $! :表示shell最后运行的后台Process的PID。
- $$:表示脚本运行的当前进程ID号。
- $?:显示上条命令的退出状态,0表示没有错误,其他表示有错误。
- bash内建环境变量:
- PATH:系统里面所有命令查找的位置。例如 echo $PATH。
- SHELL:当前用的shell是什么,可以修改配置文件修改当前shell。
- UID:当前用户的uid。
- HISTSIZE:histtory命令显示长度。
- HOME:当前用户的家目录。
- PWD:当前所在的位置。
- HISTFILE:history命令输出的内容存放文件地址。
- PS1:定义命令提示符的样式。
##变量PATH:系统里面所有命令查找的位置。
[root@mq ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
##变量SHELL:当前用的shell是什么,可以修改配置文件修改当前shell
[root@mq ~]# echo $SHELL
/bin/bash
[root@mq ~]# usermod -s /bin/sh root
[root@mq ~]# echo $SHELL
/bin/sh
##变量UID:当前用户的uid。
[root@mq ~]# echo $UID
0
[root@mq ~]# id root
uid=0(root) gid=0(root) groups=0(root)
##HISTSIZE:命令历史的长度
[root@mq ~]# echo $HISTSIZE
1000
##HOME:当前用户的家目录
[root@mq ~]# echo $HOME
/root
##变量PWD:当前所在的位置
[root@mq etc]# echo $PWD
/etc
##变量HISTFILE:命令历史报存到那个文件去了
[root@mq etc]# echo $HISTFILE
/root/.bash_history
##变量PS1:定义命令提示符的样式
[root@mq etc]# echo $PS1
[\u@\h \W]\$
[root@mq etc]# PS1='\W'
etcPS1='[\u@\h \W]\$'
- 只读变量:也就是常量,不能修改值,不能销毁,只能等shell进程终止时随之消亡。
[root@mq ~]#readonly uu=666
[root@mq ~]#echo $uu
666
[root@mq ~]#uu=777
bash: uu: readonly variable
[root@mq ~]#unset uu
bash: unset: uu: cannot unset: readonly variable
三、脚本基础知识
程序执行两类返回值:
- 程序执行的结果。
- 程序状态返回代码(0-255):
- 0:正确执行。
- 1-255:错误执行,1、2、127系统预留,有特殊意义。
注意事项:
- 禁止将未成功执行过的代码直接写入脚本。
- 脚本中的命令一定要写绝对路径。
3.1 脚本测试命令
- 写脚本时,应该写一段就测试一下,测试成功再继续往下写,避免写完发现脚本执行失败。
1.bash -n 检查脚本语法是否错误。
2. bash -x单步执行,用于脚本排错。
3.2 shell运算符
运算符 | 释义 |
---|---|
let C= $ A+$B | let表示“让”,让C=A+B |
C=$ [$ A+$ B] | $ [算术运算表达式] |
C=$ (($ A+$ B)) | $((算术运算表达式)) |
C= ` expr $A + $B ` | 有反引号,表达式中各操作数及运算符之间要有空隔,而且要使用命令引用 |
1.例一, let C= $ A+$B 。
#加法。
[root@mq ~]# cat boat.sh
#!/bin/bash
let a=$1+$2
echo $a
[root@mq ~]# bash boat.sh 1 2
3
#减法。
[root@mq ~]# cat boat.sh
#!/bin/bash
let a=$1-$2
echo $a
[root@mq ~]# bash boat.sh 9 1
8
#乘法。
[root@mq ~]# cat boat.sh
#!/bin/bash
let a=$1*$2
echo $a
[root@mq ~]# bash boat.sh 1 5
5
##除法,保留小数。
[root@mq ~]# cat boat.sh
#!/bin/bash
echo 'scale=2;5/2' | bc #scale保留几位小数,bc需要下载
[root@mq ~]# bash boat.sh
2.50
2.例二,C=$ [$ A+$ B] ,可取加减乘除, +/-/*/(/)。
##加法。
[root@mq ~]# a=$[1+2]
[root@mq ~]# echo $a
3
3.例三,C=$ (($ A+$ B)),可取加减乘除, +/-/*/(/)。
##加法。
[root@mq ~]# a=$((33+4))
[root@mq ~]# echo $a
37
4.例四,C=` expr $A + $B ` 。
[root@mq ~]# cat boat.sh
#!/bin/bash
a=`expr $1 + $2`
echo $a
[root@mq ~]# ./boat.sh 2 3
5
3.3 命令逻辑关系
- 逻辑与:&& 两个条件必须都为真,输出才为真。
- 第一个条件为假时,第二个条件不用再判断,最终结果已经有
- 第一个条件为真时,第二个条件必须得判断
- 逻辑或:|| 两个条件有一个为真,输出才为真
- 前一个命令的结果为真时,第二个命令就不执行。
- 前一个命令的结果为假时,第二个命令必须执行
1.两个条件:1不等于2,2大于或等于2,两个条件都成立,返回0。
2.两个条件:1大于2,2大于3,两个条件都不成立,返回1。
3.4 bash条件判断
条件测试类型:
- 整数测试
- 字符测试
- 文件测试
3.4.1 条件测试的表达式
1.例一,[ expression ]
[root@mq ~]# [ 1 -le 2 ]
[root@mq ~]# echo $?
0
2.例二,[[ expression ]]
[root@mq ~]# [[ 1 -le 2 ]]
[root@mq ~]# echo $?
0
3.例三,test expression
[root@mq ~]# test 1 -le 2
[root@mq ~]# echo $?
0
3.4.2 整数测试
运算符 | |
---|---|
-eq | 测试两个整数是否相等 |
-ne | 测试两个整数是否不等 |
-gt | 测试一个数是否大于另一个数 |
-lt | 测试一个数是否小于另一个数 |
-ge | 大于或等于 |
-le | 小于或等于 |
3.4.2 字符测试
运算符 | 释义 |
---|---|
== | 等值比较,检查==两边的内容是否一致,==两边都要有空格 |
!= | 检查两边内容是否不一致,不一致为真,一致为假 |
=~ | 左侧字符串是否能够被右侧的PATTERN所匹配到。此表达式应用于双中括号[[]]中 |
-z “string” | 测试指定字符串是否为空,空则为真,不空则为假 |
-n “string” | 测试指定字符串是否不空,不空则为真,空则为假 |
1.例一。
2.例二,-z ‘string’
3.4.3 文件测试
标识符 | 释义 | 示例 |
---|---|---|
-f | 测试文件是否为普通文件。 | [ -f anaconda-ks.cfg ] |
-d | 测试指定路径是否为目录 | [ -d httpd/ ] |
-s | 测试文件是否非空 | [ -s qingjun.txt ] |
-e | 测试文件是否存在 | |
-b | 测试文件是否为块设备文件 | |
-c | 测试文件是否为字符设备文件 | |
-h | 测试文件是否为符号链接文件 | |
-L | 测试文件是否为符号链接文件 | |
-p | 测试文件是否为命名管道文件 | |
-S | 测试文件是否为套接字文件 | |
-r | 文件权限类,测试当前用户对指定文件是否有读权限 | |
-w | 文件权限类,测试当前用户对指定文件是否有写权限 | |
-x | 文件权限类,测试当前用户对指定文件是否有执行权限 | |
-g | 文件特殊权限,测试文件是否有sgid权限 | |
-u | 文件特殊权限,测试文件是否有suid权限 | |
-k | 文件特殊权限,测试文件是否有sticky权限 | |
-t fd | fd表示的文件描述符是否已经打开且与某终端相关 | |
file1 -ef file2 | 测试file1与file2是否指向同一个设备上的相同inode,说白点就是两者是不是同一个文件 | |
file1 -nt file2 | 测试file1是否比file2新 | |
file1 -ot file2 | 测试file1是否比file2旧 | |
-N | 测试文件自从上一次被读取之后是否被修改过 | |
-O | 测试文件是否存在并且被当前用户拥有 | |
-G | 测试文件是否存在并且默认组是否为当前用户组 |
3.4.4 组合测试条件
标识符 | 释义 |
---|---|
-a | 表示与,两个条件都要成立 |
-o | 表示或,只要一个条件成立即可 |
! | 非关系,取反 |
1.例一,测试-a与关系。
[root@mq ~]# [ 1 -eq 1 -a 2 -le 3 ]
[root@mq ~]# echo $?
0
[root@mq ~]# [ 1 -eq 1 -a 2 -gt 3 ]
[root@mq ~]# echo $?
1
[root@mq ~]#
2.例二,测试 -o或关系。
[root@mq ~]# [ 1 -eq 1 -o 2 -gt 3 ]
[root@mq ~]# echo $?
0
[root@mq ~]#
3.例三,测试 ! 取反。
[root@mq ~]# [ ! 1 -gt 1 ]
[root@mq ~]# echo $?
0