shell 脚本之基本概念及基本命令
shell 脚本概述:
shell脚本是能运行的文本,它包含命令和运行逻辑关系 。与C语言、C++、C#等编程语言不同,Shell脚本不需要编译、连接及生成可执行文件,直接由相应的解释器(最常用的解释器为bash) 解释执行即可。它的优点是可批量,多次执行(使用)
脚本的一般格式:
说明
幻数
想要执行的命令
##实验都在虚拟机中操作
1.如何自动生成脚本的说明
实验:
cd /mnt
vim /etc/vimrc
######################
vim file.sh #脚本一般以 .sh 结尾,必须是新建立的文件才会自动出现说明
#####################
2.同步文件内容(diff 命令)
diff命令的使用:
实验:
vim file1
cat file1
vim file2
cat file2
diff westos westos1 #比较两个文件不同, 以第二个文件为主
vim file3
cat file3
vim file4
cat file4
diff file3 file4
vim file5
cat file5
vim file6
cat file6
diff file5 file6
补丁的使用:
实验:
rm -rf file{3..6}
cat file1
cat file2
diff -u file1 file2 #生成补丁
diff -u file1 file2 > file.path # > 表示 导入
ls
cat file.path #查看补丁的内容
yum install patch -y
patch file1 file.path #使补丁生效(执行补丁) 但这样做,会丢失原文件
cat file1
cat file2
若想要保存原文件内容,则需要执行:
vim westos1 ##必须重新建立文件,因为刚刚的文件直接执行补丁之后原文件就已经丢失
cat westos1
vim westos2
cat westos2
diff -u westos1 westos2
diff -u westos1 westos2 > westos.path
ls
patch -b westos1 westos.path #保存原文件内容
patch westos1 westos.path #执行补丁
cat westos.orig #原文件内容会自动保存到westos.orig中
3.cut命令
##多用于字符截取
cut -d #指定分隔符
cut -f #指定截取的列
cut -c #指定截取的字符位置
例如:
cut -d " " #指定空格为分隔符
cut -f 1,3 #指定截取1~3列(等同于cut -f 1-3)
cut -c 1,5 #指定截取1~5的字符(等同于cut -c 1-5)
@@编写脚本文件,使执行脚本时,只显示自己的ip
vim ip_show.sh
########################
sh ip_show.sh #执行脚本
4.&& 和 || 的应用
&& #代表 ture(正确)
|| #代表 false(错误)
@@检测某个确定的ip是否能ping通
命令的方式:
ping -c1 -w1 172.25.254.130 &> /dev/null && echo 172.25.254.130 is up || echo 172.25.254.130 is down
##如果ping 130 能ping通,则输出172.25.254.130 如果不能ping通 则输出172.25.254.130 is down
ping -c1 -w1 172.25.254.177 &> /dev/null && echo 172.25.254.177 is up || echo 172.25.254.177 is down
脚本的方式:
vim check_ip.sh
####################
sh check_ip.sh #sh方式执行脚本
chmod +x check_ip.sh
/mnt/ check_ip.sh #绝对路径方式执行脚本
5. sort 命令
##多用于字符排序
实验:
sort -n #纯数字排序
sort -r #倒序
sort -u #去掉重复的数字
sort -o #输出到指定文件
sort -t #指定分隔符
sort -k #指定要排序的列
例如:
sort -o file1 file2 #将file2中的内容输出到file1中
实验:
vim westos
cat westos
sort westos #两位数会当作两列数分别排序
sort -n westos #顺序
sort -nr westos #倒序
sort -nu westos #顺序并去掉重复的数
sort -o westos. westos #将westos文件里的内容输出到westos.中
cat file1
rm -rf westos
vim westos
cat westos
sort -n westos #只对第一列排序
sort -nt : -k 2 westos #只对第二列排序
6. uniq 命令
##对充重复的字符做相应的处理(常常和 sort命令搭配着使用)
uniq -u #显示唯一的行
uniq -d #显示重复的行
uniq -c #显示并统计重复次数
实验:
cat westos
sort -n westos | uniq -c #顺序显示并统计重复次数
sort -n westos | uniq -d #显示重复的数
sort -n westos | uniq -u #显示唯一的数
@@输出/mnt目录里最大的文件
方法一:
实验:
ll
ll | grep -v total #过滤掉total这一行
ll | grep -v total | awk -F " " 'NR==1{print $9}' #以空格为分隔符,输出第1行的第9列
方法二:
ll | grep -v total #过滤掉total这一行
ll | grep total -v | awk -F " " '//{print $5,$9}' | sort -nr #以文件的大小 倒序 输出 第5列和第9列
ll | grep total -v | awk -F " " '//{print $5,$9}' | sort -nr | head -n 1 #head -n 1 输出第一行
ls -l /mnt | grep total -v | awk -F " " '//{print $5,$9}' | sort -nr | head -n 1 | cut -d " " -f 2
##cut -d " " -f 2 # -d 指定空格为分割符,-f 2 指定截取第二列
7. test命令:
test "$a" = $b" 等同于 [ "$a" = "$b" ]
####
[ "$1" = "$2" ] #判断$1是否等于$2
[ "$1" -eq "$2" ] #判断$1是否等于$2 (equal)
[ "$1" != "$2" ] #判断$1是否不等于$2
[ "$1" -ne "$2" ] #判断$1是否不等于$2 (no equal)
[ "$1" -le "$2" ] #判断$1是否小于等于$2 (less than equal)
[ "$1" -lt "$2" ] #判断$1是否小于$2 (less than)
[ "$1" -ge "$2" ] #判断$1是否大于等于$2 (greater than equal)
[ "$1" -gt "$2" ] #判断$1是大于$2 (greater than)
[ -z "$2" ] #判断$2是否为空
[ -n "$2" ] #判断$2是否不为空
实验:
##判断是否相等
a=1
b=1
test "$a" = "$b" && echo yes || echo no
b=2
test "$a" = "$b" && echo yes || echo no
a=1
b=1
[ "$a" = "$b" ] && echo yes || echo no
a=1
b=2
[ "$a" -eq "$b" ] && echo yes || echo no
##判断是否不等
a=1
b=2
[ "$a" != "$b" ] && echo yes || echo no
[ "$a" -ne "$b" ] && echo yes || echo no
##判断是否小于等于/小于/大于等于/大于
a=1
b=3
[ "$a" -le "$b" ] && echo yes || echo no
[ "$a" -lt "$b" ] && echo yes || echo no
[ "$a" -ge "$b" ] && echo yes || echo no
[ "$a" -gt "$b" ] && echo yes || echo no
##判断是否为空/不为空
echo $c
[ -z "$c" ] && echo yes || echo no
[ -n "$c" ] && echo yes || echo no
c=1
[ -z "$c" ] && echo yes || echo no
[ -n "$c" ] && echo yes || echo no
####
[ "file1" -ef "file2" ] #判断file1与file2的节点是否相同
[ "file1" -ot "file2" ] #判断file1创建的时间是否比file2创建的时间早
[ "file1" -nt "file2" ] #判断file1创建的时间是否比file2创建的时间晚
[ -e "$1" ] #判断$1是否存在
[ -f "$1" ] #判断$1是否为普通文件
[ -L "$1" ] #判断$1是否为软链接
[ -S "$1" ] #判断$1是否为套接字
[ -b "$1" ] #判断$1是否为块设备
[ -d "$1" ] #判断$1是否为目录
[ -c "$1" ] #判断$1是否为字符设备
实验:
##判断节点是否相同
rm -rf *
ls
touch file
ln /mnt/file /mnt/file1
ls -li *
[ "/mnt/file" -ef "/mnt/file1" ] && echo yes || echo no
[ "/mnt/file" -ef "/etc/passwd" ]&& echo yes || echo no
##判断文件建立时间的早晚
rm -rf *
touch file1
touch file2 #过一会儿再建立
ll
[ "/mnt/file1" -ot "/mnt/file2" ]&& echo yes || echo no
[ "/mnt/file1" -nt "/mnt/file2" ]&& echo yes || echo no
##判断文件是否存在
ls
[ -e "/mnt/file1" ]&& echo yes || echo no
[ -e "/mnt/file3" ]&& echo yes || echo no
@@检测某个ip是否能ping通
实验:
vim ip_check.sh
##################
sh ip_check.sh
sh ip_check.sh 172.25.254.130
sh ip_check.sh 172.25.254.333
@@检验某个数是否在1~10以内
实验:
vim num_check.sh
sh num_check.sh
sh num_check.sh 3
sh num_check.sh 15
@@判断/mnt/file文件的类型
命令的方式:
实验:
rm -fr *
ls
touch file
[ -f "/mnt/file" ]&& echo yes || echo no
[ -L "/mnt/file" ]&& echo yes || echo no
[ -S "/mnt/file" ]&& echo yes || echo no
[ -b "/mnt/file" ]&& echo yes || echo no
rsync -D /dev/vdb /mnt/file
[ -b "/mnt/file" ]&& echo yes || echo no
脚本的方式:
实验:
vim file_check.sh
#######################
sh file_check.sh
sh file_check.sh westos
sh file_check.sh /etc/passwd
sh file_check.sh /dev/vdb
8. tr命令的使用
#一般情况下,大小写有区别,但这样很不合理
实验:
vim test.sh
#####################
sh test.sh hello ##大小写有区别
sh test.sh HELLO
解决方案:
tr 'a-z' 'A-Z' < test.sh #将test.sh文件里的内容的小字母转换为大写并输出,但并不会改变原文件内容
tr 'A-Z' 'a-z' < test.sh #将test.sh文件里的内容的大字母转换为小写并输出 ,但并不会改变原文件内容
vim test.sh
####################
sh test.sh hello ##不区分大小写
sh test.sh HELLO
@@用脚本实现建立用户并设定密码
实验:
vim user_create.sh
########################
sh user_create.sh student
sh user_create.sh student student
sh user_create.sh linux 123
id linux