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


猜你喜欢

转载自blog.csdn.net/love_sunshine_999/article/details/80677802