SHELL学习笔记
1. Bash 变量
1.1 什么是变量与变量分类
变量是计算机内存的单元,其中存放的值可以改变;
变量让你能够把程序中准备使用的每一段数据都赋给一个简短、易于记忆的名字,因此他们十分有用
1.2 变量的命名规则
- 变量名必须以字母或下划线大头,名字中间只能由字母、数字和下划线组成
- 变量名的长度不得超过255个字符
- 变量名在有效的范围内必须是唯一的
- 在Bash中,变量的默认类型都是字符串型
1.3 变量的分类
-
用户自定义变量。变量自定义的
变量名=变量值
例如:
x=5;
name=“jie cao”
变量的调用:
echo $x
echo $name
变量的叠加
x=123
x=“$x”456 或者 x=${x}789
x=$x #x=123456
变量调用
$x
$name
删除变量
unset 变量名
unset x
变量查看
set [选项] -u:如果设定此选项,调用未声明变量时会报错(默认无任何提示)
-
环境变量:这种变量中主要保存的是和系统操作环境相关的数据。变量可以自定义,但是对系统生效的环境变量名和变量作用是固定的
环境变量与用户自定义变量的区别
环境变量是全局变量
用户自定义变量是局部变量
自定义环境变量
export 变量名=变量值 或者 变量名=变量值;export 变量名
查看环境变量
set #查看所有变量
env #查看环境变量
删除变量
unset 变量名
常用环境变量
HOSTNAME:主机名
SHELL:当前的shell
TERM:终端环境
HISTSIZE:历史命令条数
SSH_CLIENT:当前操作环境是用ssh链接的,这里记录客户端ip
SSH_TTY:ssh链接的终端时pts/1
USER:当前登录的用户
PATH:系统搜索命令的路径
echo $PATH #查看PATH环境变量
PATH=“$PATH”:/root/sh #增加PATH变量的值
当前语系变量查询
locale #查询当前系统语系
-LANG:定义系统主语系的变量
-LC_ALL:定义整体语系的变量
-
位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的
$n:n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数需要用大括号包含,如${10}
$*:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体
$@:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待
$#:这个变量代表命令行中所有参数的个数
-
预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的
$0:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确
$$:当前进程的进程号(PID)
$!:后台运行的最后一个进程的进程号(PID)
1.4 接收键盘输入
- read [选项] [变量名]
- -p:“提示信息”:在等待read输入时,输出提示信息
- -t秒数:read命令会一直等待用户输入,使用此选项可以指定等待时间
- -n 字符数:rea的命令只接受指定的字符数,就会执行
- -s:隐藏输入的数据,适用于机密信息的输入
2. Shell运算符
2.1 declare命令 #声明变量类型
- declare [+/-] [选项] 变量名
- -:给变量设定类型属性
- +:取消变量的类型属性
- -a:将变量声明为数组型
- move[0]=cl
- move[1]=tpc
- declare -a movie[2]=live
- echo ${movie} #列出第一个
- echo ${movie[2]} #列出第二个
- ehco ${movie[*]} #列出所有
- -i:将变量声明为整型(integer)
- -x:将变量声明为环境变量 #与export 作用相似
- -r:将变量声明为只读变量
- -p:显示指定变量的被声明的类型
2.2 数值运算的方法
- 方法1:aa=123;bb=456 ;declare -i cc=$aa+$bb;
- 方法2:expr或let数值运算工具
- dd=$(expr $aa + $bb) #注意:+号两侧必须有空格
- 方法3:$((运算式))或者$[运算式] #常用
- ff=$($aa+$bb)
- uu=[$aa+$bb]
2.3 变量测试 #了解即可
- 好处:代码精简
- 坏处:逻辑混乱
3.环境变量配置文件
4.正则表达式
sed [选项] '[动作]' 文件名
选项:
- -n:一般sed命令会把所有数据都输出到屏幕,如果加入此选择则只会把经过sed命令处理的行输出到屏幕
- -e:允许对输入数据应用多条sed命令编辑
- -i:用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出
动作:
- -a:追加,在当前行后添加一行或多行
- -c:行替换,用c后面的字符串替换原数据行 #sed '4c zhehang bujige' student.txt
- -i:插入,在当前行前插入一行或多行。 #sed '2i piaoliang jiushi renxing ' student.txt
- -d:删除,删除指定的行 #sed '2a piaoliang jiushi renxing ' student.txt
- -p:打印,输出指定的行
- -s:子串替换,用一个字符串替换另外一个字符串。格式为“行范围s/旧字串/新子串/g”(和vim中的替换格式类似) #sed '4s/70/100/g' student.txt #sed -e 's/a//g;s/c//g' student.txt
字符处理命令
- sort 排序命令
sort [选项] 文件名
-f:忽略大小写
-n:以数值型进行排序,默认使用字符串型排序
-r:反向排序
-t:指定分隔符,默认是分隔符时制表符
-k n[,m]:按照指定的字段范围排序。从第n字段开始,m字段结束(默认到行尾)
- wc统计命令
wc [选项] 文件名
-l:只统计行数
-w:只统计单词数
-m:只统计字符数
5.流程控制语句
5.1 条件判断式语句
按照文件类型进行判断
-b文件:判断文件是否存在,并且是否为块设备文件(是块设备文件为真)
-c文件:判断文件是否存在,并且是否为字符设备文件(是字符设备文件为真)
-d文件:判断文件是否存在,并且是否为目录文件(是目录为真)
-e文件:判断文件是否存在,(存在为真)
-f文件:判断文件是否存在,并且是否为普通文件(是普通文件为真)
-L文件:判断文件是否存在,并且是否为符号链接文件(是符号链接文件为真)
-p文件:判断文件是否存在,并且是否为惯导文件(是管道文件为真)
-s文件:判断文件是否存在,并且是否为非空(非空为真)
-S文件:判断文件是否存在,并且是否为套接字文件(是套接字文件为真)
按照文件权限判断
-r文件:判断文件是否存在,并且是否该文件拥有读权限(有读权限为真)
-w文件:判断文件是否存在,并且是否该文件拥有写权限(有写权限为真)
-x文件:判断文件是否存在,并且是否该文件拥有执行权限(有执行权限为真)
-u文件:判断文件是否存在,并且是否该文件拥有SUID权限(有SUID权限为真)
-g文件:判断文件是否存在,并且是否该文件拥有SGID权限(有SGID权限为真)
-k文件:判断文件是否存在,并且是否该文件拥有SBit权限(有SBit权限为真)
两个文件之间的比较
文件1 -nt 文件2: 判断文件1的修改时间是否文件2的新(如果新则为真)
文件1 -ot 文件2: 判断文件1的修改时间是否比文件2的旧(如果旧则为真)
文件1 -ef 文件2: 判断文件1是否和文件2的inode号一致,可以理解为两个文件是否为同一个文件。这个判断用于判断硬链接是很好的方法
两个整数之间的比较
整数1 -eq 整数2: 判断整数1是否和整数2相等(相等为真) equal
整数1 -ne 整数2:判断整数1是否和整数2不相等(不相等为真) not equal
整数1 -gt 整数2:判断整数1是否大于整数2(大于为真) greater than
整数1 -lt 整数2:判断整数1是否小于整数2(小于为真) less than
整数1 -ge 整数2:判断整数1是否大于等于整数2(大于等于为真) greater or equal
整数1 -le 整数2:判断整数1是否小于等于整数2(小于等于为真) less or equal
字符串的判断
-z:判断字符串:判断字符串是否为空(为空返回真)
-n:判断字符串是否为非空(非空返回真)
字符串1 == 字符串2:判断字符串1是否和字符串2相等(相等返回真)
字符串1 != 字符串2:判断字符串1是否和字符串2不相等(不相等返回真)
多重条件判断
判断1 -a 判断2: 逻辑与,判断1和判断2都成立,最终的结果才为真
判断1 -o 判断2 :逻辑或,判断1和判断2有一个成立,最终的结果就为真
!判断:逻辑非,使原始的判断式取反
5.2 单分支if语句
if [ 条件判断式 ]; then
程序
fi
或者
if [ 条件判断式 ]
then
程序
fi
5.3 双分支if语句
if [条件判断式]
then
条件成立时,执行的程序
else
条件不成立时,执行的另一个程序
fi
#例如 #判断apache服务是否运行
5.4 多分支条件语句
if [条件判断式1]
then
条件成立时,执行的程序
elif [条件判断式2]
then
条件不成立时,执行的另一个程序
...省略更多条件
else
当所有条件都不成立,最后执行此程序
fi
5.5 多分支case语句
case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
...省略其他分支...
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
5.6 for循环
for 变量 in 值1 值2 值3
do
程序
done
或者
for (i= 值1;i<=值2;i=epx)
do
程序
done
5.7 while循环
while 循环是不定循环,也称作条件循环。只要条件判断式成立,循环就会一直继续,直到条件判断式不成立,循环才会停止。这就和for的固定循环不太一样了。
while [条件判断式]
do
程序
done
5.8 until循环
until循环,和while循环相反,until循环时只要条件判断式不成立则进行循环,并执行循环程序,并执行循环程序。一旦循环条件成立,则终止循环