shell
预定义变量
$$:表示当前的进程号PID
$! :后台运行的最后一个进程的进程号PID
$?:返回最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行,如果这个变量的值为非0(具体哪个数,由命令自己来决定),则证明上一个命令执行不正确
运算符
1)$((运算符)) 或 KaTeX parse error: Undefined control sequence: \* at position 55: …r m - n 4)expr \̲*̲ , / , % , 乘,除,…[(2 +3)*4] 推荐使用
方法二: $(((2 +3) × 4))
方法三:expr 不推荐使用
条件判断
1)两数比较
- = 字符串比较
- -lt 小于
- -le小于等于
- -gt 大于
- -ge大于等于
- -ne不等于
2) 按照文件权限进行判断
- -r 有读的权限
- -w 有写的权限
- -x 有执行的权限
3)按照文件类型进行判断
- -f 文件存在而且还是一个常规文件
- -e 文件存在
- -d 文件存在而且还是一个目录
案例:1,“OK” 是否等于“ok”
if [ "ok" = "ok" ]
then
echo "equal"
fi
2, 23是否大于等于22
if [ 23 -ge 22 ]
then
echo "大于"
fi
3,/root/wcx/11.sh 是否存在文件
if [ -e /root/wcx/11.sh]
then
echo "e"
else
echo "!e"
fi
流程控制
case语句
case $变量名 in
“值1”)
如果变量的值等于值1,则执行程序1
;;
“值2”)
如果变量的值等于值2,则执行程序2
;;
…等等
*)
esac
案例:当命令行参数是1时,输出“周一”,是2时,输出“周二”,其他情况输出“other”
case $1 in
"1")
echo "yi"
;;
"2")
echo "er"
;;
*)
echo "other"
;;
esac
for 循环
语法1:
for 变量 in 值1 值2 值3
do
程序
done
案例 打印命令行输入的参数
#使用$* 表示命令行输入的是一个整体
for i in "$*"
do
echo "the num is $i"
done
#使用$@ 表示命令行输入的是数组
for j in "$@"
do
echo "the num is $j"
done
基本语法2
for((初始值;循环控制条件;变量变化))
do
程序
done
案例 :从1加到100的值输出显示
SUM=0
for((i=1;i<=100;i++))
do
SUM=$[$SUM+$i]
done
echo "sum=$SUM"
while循环
基本语法
while [ 条件判读式 ]
do
程序
done
案例:从命令行输入一个数n,统计从1+…+n的值是多少
SUM=0
i=0
while [ $i -le $1 ]
do
SUM=$[$SUM+$i]
i=$[$i+1]
done
echo "sum=$SUM"
read读取控制台输入
基本语法
read (选项)(参数)
选项
-p:指定读取值时的提示符
-t:指定读取值等待的时间(秒),如果没有在指定的时间内输入就不在等待了
参数
变量:指定读取的变量名
案例
#读取控制台输入的一个num值
read -p "请输入一个数num= " NUM1
echo "你输入的值是num=$NUM1"
#读取控制台输入的一个num值,在10s内输入、
read -t 10 -p "请输入一个数num= " NUM2
echo "你输入的值是num=$NUM2"
函数
shell编程和其他编程语言一样,有系统函数,也可以自定义函数
系统函数
basename 基本语法
功能:返回完整路径最后/的部分,常用于获取文件名
案例
#返回/home/wcx/test.py 的“test.py” 部分
basename /home/wcx/test.py
#返回
test.py
若是给定文件格式,只返回文件名
basename /home/wcx/test.py .py
#返回
test
dirname基本用法
功能:返回完整路径最后/的前面部分,常用于返回路径部分
#返回/home/wcx/test.py 的“/home/wcx” 部分
dirname /home/wcx/test.py
#返回
/home/wcx
自定义函数
基本用法
调用时直接写函数名
案例:计算输入的两个参数和
function getSum(){
sum=$[$n1+$n2]
echo "sum = $sum"
}
n1=$1
n2=$2
getSum $n1 $n2
显示系统执行的进程
基本介绍
ps命令是用来查看目前系统中,有那些正在执行,以及他们执行的状况,可以不加参数
参数
ps -a:显示当前终端的所有进程信息
ps -u:以用户的格式显示进程信息
ps -x:显示后台进程运行参数
通常用的格式是ps -aux
ps -aux | more 显示全部
ps -ef 是以全格式显示当前所有进程,查看进程的父进程
ps -ef | grep XXX 显示某一个进程的信息
终止进程kill和killall
若是某个进程执行一半需要停止时,或是已消耗了很大的系统资源时,此时可以考虑停止该进程,使用kill命令来完成此项任务
基本语法:kill 进程号; killall 进程名称
常用选项:-9 :表示强迫进程立即停止
案例:
#终止远程登录服务sshd,在适当时在重启sshd服务
ps -aux | grep sshd #查看远程登录进程号
#终止多个gedit编辑器
killall 进行名称
服务管理
服务(service)本质就是进程,但是运行在后台的通常都会监听某个端口,等待其它程序的请求,比如(mysql, sshd防火墙等),因此我们又称为守护进程
service管理指令
service 服务名 start | restart |reload | status
在CentOS7.0后不在使用service,而是systemctl
案例:查看当前防火墙的状态,关闭防火墙和重启防火墙
systemctl start iptables #启动
systemctl status iptables #查看运行状态
systemctl restart iptables.service #重启
systemctl stop iptables.service #停止
systemctl enable iptables.service #设置开机启动
systemctl disable iptables.service #禁止开机启动
linux系统
Linux系统是一个多用户多任务的操作系统,任何一个要使用系统资源的用户都不必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统;linux的用户需要至少属于一个组
用户家目录/home/ : /home/目录下有各个创建的用户对应的家目录,用户登录时,会自动进入到自己的家目录,例如:/home/wcx
添加用户
useradd 用户名
1)当创建用户成功后,会自动的创建和用户同名的家目录
2) 也可以通过useradd -d 指定目录 新的用户名,给新创建的用户指定家目录
指定、修改密码
passwd 用户名 :给指定的用户名添加密码
*** 删除用户***
userdel 用户名
#删除用户xm ,但是要保留用户的家目录
userdel xm
#删除用户xm以及用户的家目录
userdel -r xm
#查询root 信息
id root
uid=0(root) gid=0(root) groups=0(root)
#用户id号 所在组的id号 组名
查看当前用户、登录用户
whoami
用户组
新增组
groupadd 组名
删除组
groupdel 组名
增加用户时直接加上组
useradd -g 用户组 用户名
修改用户组
usermod -g 用户组 用户名
Shell 工具
1, cut
cut的工作就是剪,具体就是在文件中负责剪切数据用的,cut命令从文件的每一行剪切字节,字符和字段并将这些字符,字节和字段输出
cut [ 选项参数 ] filename 说明:默认分隔符是制表符
选择参数说明
- f : 列号,提取第几列
- d : 分隔符,按照指定分隔符分割线
- c :指定具体的字符
#按照:来分割,取第一列内容
ifconfig | grep virbr0 | cut -d : -f 1
# 在第一次切割的基础上再次按照“ ”切割,取第一列的内容
ifconfig | grep virbr0 | cut -d : -f 1 | cut -d " " -f 1
#在第一次切割的基础上,按照字符串的格式取第二个字符
ifconfig | grep virbr0 | cut -d : -f 1 | cut -c 2
#) 正则规则
\ 转义
^ 一行的开头 ^R----------表示以R开头的行
$ 匹配一行的介绍 R$---------- 表示以R结束的行
表示上一个字符匹配0次或多次,贪心匹配
.匹配一个任意字符, . 匹配任意字符串
[ ] 表示匹配某个范围内的字符串 [a-z] —匹配一个a-z之间的字符串 [a-z]* --匹配任意字母字符串
2,sed
sed 是一种流编辑器,它一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓存区的内容展示再命令行,接着处理下一行,这样不断重复,直到文件末尾,文件内容并没有改变,除非你使用重定向存储输出
sed [选择参数] ‘command’ filename
选择参数
- e : 直接在指令列模式下进行sed的动作编辑
- i :直接编辑
命令功能描述
a : 新增,a的后面可以接字符串,在下一行出现
d :删除行,
s : 匹配替换
#删除一行 删除第2行
ifconfig | sed 2d
#删除多行 1,2两行
ifconfig | sed 1,2d
#匹配flags,在匹配到的行后面添加xxxxx
ifconfig | sed '/flags/axxxxx'
#在1-9行内匹配inet ,匹配到了就用xxx替换
ifconfig | sed '1,9s/inet/xxx/g'
#在1-9行内匹配inet6* , 匹配到了就用AAA替换
ifconfig | sed '1,9s/inet[6]*/AAA/g'
3) awk
一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将各行切片,切开的部分再进行分析处理
基本用法
awk [选项参数] ‘ pattern{action1} pattern{action2} ’ filename
pattern:表示AWK再数据中查找的内容,就是匹配模式
action:在找到匹配内容时所执行的一系列命令
选项参数说明
-F 指定输入文件拆分符
-V 赋予一个用户定义的变量
#要匹配的内容
wcx:x:1000:1000:wcx:/home/wcx:/bin/bash
# 以:为分隔符,匹配以wcx开头的行,取分割后的第一列
cat /etc/passwd | awk -F : '/^wcx/{print $1}'
wcx
cat /etc/passwd | awk -F : '/^wcx/{print $3}'
1000
#匹配所有行安装:分割的,第三列
cat /etc/passwd | awk -F : '{print $3}'
0
1
2
3
4
5
6
7
59
#再匹配的内容前加上BEGIN 再最后加上END
cat /etc/passwd | awk -F : 'BEGIN{print "BEGIN"}{print}END{print "END"}'
BEGIN
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
END
# 设置一个变量sum,初始值为0再加上每行的第三列的数,在输出每行的第三列,最后输出结果
cat /etc/passwd | awk -F : 'BEGIN{sum=0}{sum+=$3;print sum }END{print "sum="sum}'
0
1
3
6
10
sum=20
#于上面情况大致类似,只是再每行的输出是,加个一个每行的第三列
cat /etc/passwd | awk -F : 'BEGIN{sum=0}{sum+=$3;print $3" "sum }END{print "sum="sum}'
0 0
1 1
2 3
3 6
4 10
5 15
6 21
7 28
8 36
11 47
12 59
14 73
99 172
sum=172
#与上一行结果相同
cat /etc/passwd | awk -F : -v sum=0 '{sum+=$3;print $3" "sum }END{print "sum="sum}'
4)sort
sort命令是在Linux里非常有用的,它将文件进行排序,并将排序结果标准输出
基本语法
sort (选项)(参数)
- -n 依照数值大小 排序
- -r 以相反的顺序来排序
- -t 设置排序时所用的分隔符
- -k 指定需要排序的列
#挑选出以p开头的
cat /etc/passwd |grep ^p
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
#以:分割 ,并以第三列的数来排序,排序规则按照字符串排序
cat /etc/passwd |grep ^p | sort -t : -k 3
pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
#按照数字大小来排列
cat /etc/passwd |grep ^p | sort -t : -k 3 -n
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin