Shell学习
注意: Linux中 管理员账户是 #, 普通账户是 $
Shell概述
shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6Y1lMHw3-1682929321302)(C:\Users\23058\AppData\Roaming\Typora\typora-user-images\image-20230429101049774.png)]
shell还是一个功能强大的编程语言,易编写,易调试,灵活性强。
Shell解析器
解析器类型
- sh
- bash
- nologin
- dash
- tcsh
- csh
其中,sh软链接到bash, centos默认解析器是bash
Shell脚本入门
脚本格式
#!/bin/bash
第一个shell脚本
输出:helloworld
脚本文件:
#!/bin/bash
echo "hello world"
方式一:
[root@VM-4-5-centos datas]# sh helloworld.sh
hello world
方式二:
[root@VM-4-5-centos datas]# chmod 777 helloworld.sh
[root@VM-4-5-centos datas]# ./helloworld.sh
hello world
方式1,本质是bash解析器帮你执行脚本,所以脚本本身不需要执行权限;方式2,本质是脚本自己需要执行,所以需要执行权限
第二个shell脚本:
多命令处理
[root@VM-4-5-centos datas]# touch batch.sh
[root@VM-4-5-centos datas]# vim batch.sh
#!/bin/bash
cd /home/tingyu/
touch yunshan.txt
echo "l love ty" >> yunshan.txt
[root@VM-4-5-centos datas]# cd ..
[root@VM-4-5-centos tingyu]# ls
datas
[root@VM-4-5-centos tingyu]# cd datas/
[root@VM-4-5-centos datas]# bash batch.sh
[root@VM-4-5-centos datas]# cd ..
[root@VM-4-5-centos tingyu]# ll
total 8
drwxr-xr-x 2 root root 4096 Apr 29 15:57 datas
-rw-r--r-- 1 root root 10 Apr 29 15:57 yunshan.txt
[root@VM-4-5-centos tingyu]# cat yunshan.txt
l love ty
[root@VM-4-5-centos tingyu]#
Shell中的变量
系统变量
- 定义变量:变量=值
- 撤销变量: unset变量
- 声明静态变量: readonly 变量,不能unset
常用的系统变量
$HOME $PWD $SHELL $USER
[root@VM-4-5-centos tingyu]# echo $HOME
/root
[root@VM-4-5-centos tingyu]# echo $PWD
/home/tingyu
[root@VM-4-5-centos tingyu]# echo $SHELL
/bin/bash
[root@VM-4-5-centos tingyu]# echo $USER
root
自定义变量
变量定义规则
- 可以由字母、数字和下划线组成,不能以数字开头,环境变量名建议大写
- 等号两侧不能有空格
- 在bash中,变量默认类型是字符串类型,无法直接进行数值运算
- 变量的值如果有空格,需要用双引号或者单引号
- 可把变量提升为全局环境变量,使用export 变量名
基本语法
- 定义变量:变量=值 等号两边不能留有空格
- 撤销变量:unset 变量
- 输出变量:echo $变量
- 声明静态变量: readonly 变量,注意:不能unset
例:
设置变量:
[root@VM-4-5-centos tingyu]# A=1
[root@VM-4-5-centos tingyu]# echo $A
1
撤销变量:
[root@VM-4-5-centos tingyu]# unset A
[root@VM-4-5-centos tingyu]# echo $A
声明静态变量:
[root@VM-4-5-centos tingyu]# readonly B=3
[root@VM-4-5-centos tingyu]# echo $B
3
[root@VM-4-5-centos tingyu]# unset B
-bash: unset: B: cannot unset: readonly variable
[root@VM-4-5-centos tingyu]#
export使用
[root@VM-4-5-centos tingyu]# D=yunshan
[root@VM-4-5-centos tingyu]# echo $D
yunshan
[root@VM-4-5-centos tingyu]# cd datas/
[root@VM-4-5-centos datas]# vim helloworld.sh
#!/bin/bash
echo "hello world"
echo $D
[root@VM-4-5-centos datas]# ./helloworld.sh
hello world
[root@VM-4-5-centos datas]# export D
[root@VM-4-5-centos datas]# ./helloworld.sh
hello world
yunshan
特殊变量
$n
n为数字,$n表示该脚本名称,$1-$9表示第一到第九个参数,10以上的参数要用大括号括起来,此处参数表示执行脚本时的参数
[root@VM-4-5-centos datas]# touch parameter.sh
[root@VM-4-5-centos datas]# vim parameter.sh
#!/bin/bash
echo "$0 $1 $2 $3"
[root@VM-4-5-centos datas]# bash parameter.sh
parameter.sh
[root@VM-4-5-centos datas]# bash parameter.sh tingyu
parameter.sh tingyu
[root@VM-4-5-centos datas]# bash parameter.sh tingyu yunshan
parameter.sh tingyu yunshan
[root@VM-4-5-centos datas]# bash parameter.sh tingyu yunshan ty
parameter.sh tingyu yunshan ty
$#
获取所有输入参数个数,常用于循环
[root@VM-4-5-centos datas]# vim parameter.sh
#!/bin/bash
echo "$0 $1 $2 $3"
echo $#
[root@VM-4-5-centos datas]# bash parameter.sh
parameter.sh
0
[root@VM-4-5-centos datas]# bash parameter.sh yunshan
parameter.sh yunshan
1
[root@VM-4-5-centos datas]# bash parameter.sh yunshan tingyu ty
parameter.sh yunshan tingyu ty
3
$*: 代表命令行中所有的参数,把所有参数看成一个整体
$@:代表命令行中所有的参数,把每个参数区分对待
[root@VM-4-5-centos datas]# vim parameter.sh
#!/bin/bash
echo "$0 $1 $2 $3"
echo $#
echo $*
echo $@
[root@VM-4-5-centos datas]# bash parameter.sh yunshan tingyu ty
parameter.sh yunshan tingyu ty
3
yunshan tingyu ty
yunshan tingyu ty
$?
最后一次执行的命令的返回状态,如果该变量的值为0,说明上一次正确执行了,如果返回非0的数字说明没有正确执行。
[root@VM-4-5-centos datas]# ./helloworld.sh
hello world
[root@VM-4-5-centos datas]# $?
-bash: 0: command not found
[root@VM-4-5-centos datas]# echo $?
127
[root@VM-4-5-centos datas]# bash parameter.sh yunshan tingyu ty
parameter.sh yunshan tingyu ty
3
yunshan tingyu ty
yunshan tingyu ty
[root@VM-4-5-centos datas]# echo $?
0
运算符
基本语法:
- ((运算式))或者[运算式]
- expr +,-,*,/, %
- expr运算符间要有空格
示例操作:
1.计算3 + 2
[root@VM-4-5-centos datas]# expr 3 + 2
5
2.计算3 - 2
[root@VM-4-5-centos datas]# expr 3 - 2
1
3.计算(3 + 2)X 4
[root@VM-4-5-centos datas]# expr `expr 3 + 2` \* 4
20
[root@VM-4-5-centos datas]# s=$[(2+3)*4]
[root@VM-4-5-centos datas]# echo $s
20
条件判断
1、基本语法
[ condition ]
condition前后要有空格
,条件非空即为true
2、常用判断条件
两个整数间的比较:
符号 | 描述 |
---|---|
-lt | (less than)小于 |
-le | (less equal) 小于等于 |
-eq | (equal)等于 |
-gt | (greater than) 大于 |
-ge | (greater equal) 大于等于 |
-ne | (not equal) 不等于 |
文件权限判断:
- -r 有读的权限
- -w 有写的权限
- -x 有执行的权限
文件类型判断:
- -f 文件存在并且是一个常规文件
- -e 文件存在
- -d 文件存在病是一个目录
多条件判断:
- &&:表示前一条命令执行成功时,才执行下一条命令。
- ||:表示上一条命令执行失败后,才执行下一条命令。
实例:
判断23是否大于22:
[root@VM-4-5-centos datas]# [ 23 -gt 22 ]
[root@VM-4-5-centos datas]# echo $?
0
判断文件是否有读写权限:
[root@VM-4-5-centos datas]# [ -w parameter.sh ]
[root@VM-4-5-centos datas]# echo $?
0
判断文件是否存在:
[root@VM-4-5-centos datas]# [ -e /home/bin ]
[root@VM-4-5-centos datas]# echo $?
1
多条件判断:
[root@VM-4-5-centos datas]# [ condition ] && echo ok || echo noyok
ok
[root@VM-4-5-centos datas]# [ condition ] && [ ] || echo noyok
noyok
流程控制
if判断
基本语法
if [ 条件判断式 ];then
程序
fi
或者
if [ 条件判断式 ]
then
程序
fi
注意事项:
1、[ 条件判断式 ]:中括号和条件判断式之间必须有空格
2、if后面要有空格
实例:
[root@VM-4-5-centos datas]# touch if.sh
[root@VM-4-5-centos datas]# vim if.sh
输入1,输入2,显示yunshan,tingyu输入其他什么也不显示
#!/bin/bash
if [ $1 -eq 1 ]
then
echo "tingyu"
elif [ $1 -eq 2 ]
then
echo "yunshan"
fi
[root@VM-4-5-centos datas]# bash if.sh 1
tingyu
[root@VM-4-5-centos datas]# bash if.sh 2
yunshan
[root@VM-4-5-centos datas]# bash if.sh 3
[root@VM-4-5-centos datas]#
case语句
基本语法
case $变量名 in
“值 1”)
如果变量值等于1,则执行程序1
;;
“值 2”)
如果变量值等于2,则执行程序2
;;
…省略其他分支
*)
如果变量值都不是以上的值,则执行以下程序
esac
注意:
- case行尾必须为单词in ,每一个模式匹配必须以右括号结尾
- 双分号;;表示命令序列结束,相当于java中的break
- 最后的
*)
表示默认模式,相当于java中的default
实例:
需求:输入一个数字,如果是1,则输出云山,如果是2,则输出听雨,输入其他则输出ty
[root@VM-4-5-centos datas]# touch case.sh
[root@VM-4-5-centos datas]# vim case.sh
#!/bin/bash
case $1 in
1)
echo "云山"
;;
2)
echo "听雨"
;;
*)
echo "ty"
;;
esac
[root@VM-4-5-centos datas]# bash case.sh 1
云山
[root@VM-4-5-centos datas]# bash case.sh 2
听雨
[root@VM-4-5-centos datas]# bash case.sh 6
ty
for循环
基本语法1
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
实例:
从1加到100
[root@VM-4-5-centos datas]# touch for.sh
[root@VM-4-5-centos datas]# vim for.sh
#!/bin/bash
s=0
for((i=1;i<=100;i++))
do
s=$[$s+$i]
done
echo $s
[root@VM-4-5-centos datas]# bash for.sh
5050
基本语法2
for 变量 in 值1 值2 值3 …
do
程序
done
实例:
打印所有输入参数
[root@VM-4-5-centos datas]# touch for2.sh
[root@VM-4-5-centos datas]# vim for2.sh
#!/bin/bash
for i in $*
do
echo "云山听雨 $i"
done
[root@VM-4-5-centos datas]# bash for2.sh 1
云山听雨 1
[root@VM-4-5-centos datas]# bash for2.sh 1 2 3
云山听雨 1
云山听雨 2
云山听雨 3
#!/bin/bash
for i in $*
do
echo "云山听雨 $i"
done
for j in $@
do
echo "云山 $j 听雨"
done
[root@VM-4-5-centos datas]# bash for2.sh 1 2 3
云山听雨 1
云山听雨 2
云山听雨 3
云山 1 听雨
云山 2 听雨
云山 3 听雨
#!/bin/bash
for i in "$*"
do
echo "云山听雨 $i"
done
for j in "$@"
do
echo "云山 $j 听雨"
done
[root@VM-4-5-centos datas]# bash for2.sh 1 2 3
云山听雨 1 2 3
云山 1 听雨
云山 2 听雨
云山 3 听雨
$*: 代表命令行中所有的参数,把所有参数看成一个整体
$@:代表命令行中所有的参数,把每个参数区分对待
while循环
基本语法
while [ 条件判断式 ]
do
程序
done
实例:
从1加到100
[root@VM-4-5-centos datas]# touch while.sh
[root@VM-4-5-centos datas]# vim while.sh
#!/bin/bash
s=0
i=1
while [ $i -le 100 ]
do
s=$[$s + $i]
i=$[$i + 1]
done
echo $s
[root@VM-4-5-centos datas]# bash while.sh
5050
read读取控制台输入
基本语法
read(选项)(参数)
- 选项:
- -p: 指定读取值时的提示符
- -t:指定读取值时等待的事件(秒
- 参数
- 变量:指定读取值的变量名
实例:
提示7s内,读取控制台输入的名称
[root@VM-4-5-centos datas]# touch read.sh
[root@VM-4-5-centos datas]# vim read.sh
#!/bin/bash
read -t 7 -p "在7秒内输入你的名字:" NAME
echo $NAME
[root@VM-4-5-centos datas]# bash read.sh
在7秒内输入你的名字:云山
云山
函数
系统函数
basename [string / pathname] [suffix]
(功能描述:basename命令会删掉所有的前缀包括最后一个‘/’字符,然后将字符串显示出来)
选项:suffix为后缀,如果suffix被指定了,basename会将pathname或者string中的suffix去掉。
实例:
[root@VM-4-5-centos datas]# pwd
/home/tingyu/datas
[root@VM-4-5-centos datas]# basename /home/tingyu/datas/helloworld.sh
helloworld.sh
[root@VM-4-5-centos datas]# basename /home/tingyu/datas/helloworld.sh .sh
helloworld
dirname
文件的绝对路径
功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))
实例:
[root@VM-4-5-centos datas]# dirname /home/tingyu/datas/helloworld.sh
/home/tingyu/datas
自定义函数
基本语法:
[ function ] funname[()]
{
Action:
[return int;]
}
funname
注意:
- 必须在调用函数地方之前,先声明函数。shell脚本是逐行执行,不会像其他语言一样先编译。
- 函数返回值,只能通过$?系统变量获得,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值,return后面跟数值n(0-255)
实例:
计算两个输入参数的和
[root@VM-4-5-centos datas]# touch sum.sh
[root@VM-4-5-centos datas]# vim sum.sh
#!/bin/bash
function sum()
{
s=0;
s=$[$1+$2]
echo $s
}
read -p "input your paratemer1:" p1
read -p "input your paratemer2:" p2
sum $p1 $p2
[root@VM-4-5-centos datas]# bash sum.sh
input your paratemer1:2
input your paratemer2:3
5
shell工具
cut
cut的工作就是“剪”,具体的说,就是在文件中负责剪贴数据用的。cut命令从文件中每一行剪贴字节、字符和字段,并且将这些字节、字符和字段输出。
基本用法
cut[选项参数] filename
说明
- 默认分隔符是制表符
- 选项参数
- -f 列号: 列号提取,提取第几列
- -d 分隔符,按照指定分隔符分割
实例:
[root@VM-4-5-centos datas]# touch cut.txt
[root@VM-4-5-centos datas]# vim cut.txt
yun y
shan y
ting d
yu s
切割第一列
[root@VM-4-5-centos datas]# cut -d " " -f 1 cut.txt
yun
shan
ting
yu
切割第2,3列
[root@VM-4-5-centos datas]# cut -d " " -f 2,3 cut.txt
y
y
d
s
切割 yun
[root@VM-4-5-centos datas]# cat cut.txt |grep yun |cut -d " " -f 1
yun
sed
sed是一种流编辑器,它一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,成为“模式空间”,接着sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕,接着处理下一行,这样不断重复,知道文件末尾,文件内容并没有改变,除非你使用重定向存储输出
基本用法
sed [选项参数] command filename
选项参数说明:
- 参数说明:
- -e 直接在指令列模式尚进行sed的动作编辑
- 命令功能
- a 新增
- d 删除
- s查找并替换
实例:
[root@VM-4-5-centos datas]# touch sed.txt
[root@VM-4-5-centos datas]# vim sed.txt
bei xi
jing an
huan shi
ying wo
ni jia
将yun shan 插入到sed.txt第二行,打印。
[root@VM-4-5-centos datas]# sed "2a yun shan" sed.txt
bei xi
jing an
yun shan
huan shi
ying wo
ni jia
删除sed.txt中包含wo的行
[root@VM-4-5-centos datas]# sed "/wo/d" sed.txt
bei xi
jing an
huan shi
ni jia
将sed.txt中的wo 替换为ni
[root@VM-4-5-centos datas]# sed "s/wo/ni/g" sed.txt
bei xi
jing an
huan shi
ying ni
ni jia
将sed.txt中第二行删除,并且把wo 替换为ni
bei xi
huan shi
ying ni
ni jia
awk
一个强大文件分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理
基本用法
awk [选项参数] ‘pattern1 {action1} pattern2{action2}…’ filename
说明
- pattern:表示awk再数据中查找的内容
- action:找到匹配内容时执行命令
- 选项参数
- -F:指定输入文件分隔符
- -v 赋值一个用户定义变量
awk内置变量
- FILENAME:文件名
- NR:已读的记录数
- NF:浏览记录的域的个数(切割后,列的个数)
sort
sort 命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出
基本语法
sort(选项)(参数)
- 选项
- -n 按照数值大小排序
- -r 以相反的顺序排序
- -t 设置排序使用的分隔字符
- -k 指定需要排序的列
- 参数
- 指定待排序文件列表
实例:
[root@VM-4-5-centos datas]# touch sort.sh
[root@VM-4-5-centos datas]# vim sort.sh
bb:40:5.4
aa:30:1.1
cc:20:2.2
dd:30:3.3
eee:10:9.3
第二列,按倒叙排列
[root@VM-4-5-centos datas]# sort -t : -nrk 2 sort.sh
bb:40:5.4
dd:30:3.3
aa:30:1.1
cc:20:2.2
eee:10:9.3