首页 > 技术文章 > shell脚本

fujingtao5470 2020-04-16 09:48 原文

shell脚本

shell的介绍

Shell是一种脚本语言,又是一种命令语言。通俗来讲,Shell脚本就是一系列命令的集合,可以在Unix/linux上面
直接使用,并且直接调用大量系统内部的功能来解释执行程序,把一些重复性工作交给shell做,来实现自动化运维。Shell 虽
然没有C/C++、Java、Python等强大,但也支持了基本的编程元素。例如:iffor、while等循环,还有变量、数组、字符
串、注释、加减乘除逻辑运算等。运维工程师、网络管理员、程序开发等人员应该把shell进行熟练的掌握。

shell的应用场景

主要用来开发一些实用的、自动化运维的脚本,而不是用来开发具有复杂业务逻辑的中大型软件。
监控linux系统环境的使用情况;
数据的处理,如日志的切割、分析、统计等;
与数据库的交互,如对数据库进行增,删,改,查等操作;
监控进程,自动化启停服务进程;
完成一些重复性的工作,如创建多个新用户;
在服务器集群配置文件

远程连接软件

SecureCRT、Xshell、putty
Xshell
链接:https://pan.baidu.com/s/1sHGiNiuGbK2nLkSlur-vnQ
提取码:6cae
SecureCRT
链接:https://pan.baidu.com/s/12A7vycGDm2vZaER_VuELxg 提取码:ihg4

linux的基本操作命令(常用命令)

 linux之vi编辑器

单独整理,详情地址:
https://www.cnblogs.com/fujingtao5470/p/12715152.html

linux文件权限

文件权限(- rw- r-- r-- )和 目录权限(d rw- r-- r--) 
都是可以分三列:每三个为一列,分别是所有者(owner),所属组(group),其他(others) 
rwx说明:
 r:读的权限用4表示 w:写的权限用2表示 x:执行权限用1表示

7:表示rwx
6:表示rw
5:表示rx
3:表示wx

 

shell脚本基本编写与执行

解释器:是一种命令解释器,主要作用是对命令进行运行和解释,将需要执行的操作传递给操作系统内核并执行。shell不一定得有解释器(shell脚本不加解释器,一般情况也可以用,但是容易出现问题,强烈建议shell脚本中标明解释器)
常见解释器:
# !/bin/bash(linux默认解释器) # !/bin/ksh # !/bin/bsh # !/bin/sh
一般放在shell脚本的第一行,进行定义解释器。

shell脚本书写过程中: # 表示注释,但是 #! 表示定义解释器(第一行)

1.书写第一个shell脚本:

#!/bin/bash
#注释脚本功能说明
#作者及日期
echo 'Hello World !!!'

保存为shell.sh文件

2.如果脚本在本地通过CRT上传至linux服务器

3.通过远程工具(CRT)执行shell.sh的方法

方法1:sh shell.sh 或  bash shell.sh  或  source shell.sh (前提是shell.sh文件有读的权限)
方法2:添加执行权限 chmod u+x shell.sh 或 chmod +x shell.sh(因为自己编写的shell脚本默认没有执行权限)   执行shell脚本: ./shell.sh
建议使用 sh shell.sh 或  ./shell.sh

 shell脚本中的常见变量

1.
变量赋值:a = 3 输出变量a的值:echo $a 或 echo ${b}
2.
echo $? :如果输出的是0,说明此命令(echo $?)之前的上一条命令正确执行,没有异常错误;如果输出的不是0,说明此命令(echo $?)的上一条命令执行时出现异常错误。

3.
$0 :输出脚本的文件名称
$n :n表示1-任意整数,表示输出执行脚本时的第n个参数的值是多少
$# :输出执行脚本时一共输入参数的总个数
$* :输出执行脚本时输入的所有参数

示例说明:此处用shell Scrip 进行演示,这是一个shell脚本,文件内容如下,文件名为shell01.sh

 


  执行脚本:用sh ./shell01.sh 命令执行脚本,同时后面传输15个参数,分别是:1-15

  

 

 

  执行结果:

  

 shell脚本中的常见变量

1. >      :追加信息,但是会覆盖原有的内容  示例:  cat >  demo.txt  然后输入你要录入的内容,但是你的内容会将demo.txt的原有内容覆盖掉     Ctrl+C 退出
2. >> :追加信息,只会在原有内容的后面追加你要录入的内容 示例: cat >> demo.txt 然后输入你要录入的内容,你的内容会在原有内容的后面进行追加(类似于append) Ctrl+C 退出
3. ; :可以同时书写多条命令并执行 示例 cat demo.txt;ls -lrt
4. | :管道符 示例: cat demo.txt | grep xxx 示例说明:通过cat命令将demo.txt内容读取出来,并交由grep命令进行检索含有xxx字符的数据
5. && :与,符号前后书写命令 当符号前面的命令执行成功后,后面的命令才能执行,否则,后面的命令不执行(类似java的按位与) cat demo.txt && ls
6. || :或,符号前后书写命令 当符号前面的命令执行成功后,后面的命令不执行,否则,后面的命令才能执行(类似Java的按位或) cat demo.xxx || ls
7. "" :如果其中含有变量的话,可以输出变量的值
8. '' :如果其中含有变量的话,只能输出变量名称,不会输出变量的值
"" 与 '' 的区别
 

 

 9.  ``    :可以输出命令执行的结果  示例: echo `date`  示例说明 因为date是linux命令,放在``中 ,可以执行并打印出当前时间的结果

 10. 2/dev/null   :错误输出到无底洞  ,前面书写命令,如果命令执行的结果是正确的,则直接输出执行结果,如果命令执行是错误的,则不会输出错误信息

 11. 1/dev/null   :正常输出到无底洞  ,前面书写命令,如果命令执行的结果是正确的,则不会输出执行结果,如果命令执行是错误的,则会输出错误信息

 

 shell脚本的常见运算符

整数
加:
  expr 2 + 3  expr $a + $b
  echo $[2 + 3]  echo $[a + b]
  echo $((2 + 3))  echo $((a + b))
减:
  expr 2 - 3  expr $a - $b
  echo $[2 - 3]  echo $[a - b]
  echo $((2 - 3))  echo $((a - b))
乘:
  expr 2 \* 3  expr $a \* $b
  echo $[2 * 3]  echo $[a * b]
  echo $((2 * 3))  echo $((a * b))
除:
  expr 2 / 3  expr $a / $b
  echo $[2 / 3]  echo $[a / b]
  echo $((2 / 3))  echo $((a / b))
余:
  expr 2 % 3  expr $a % $b
  echo $[2 % 3]  echo $[a % b]
  echo $((2 % 3))  echo $((a % b))

含有小数的
bc:
  bc是Linux自带的计算器
  输入bc命令,直接输入运算,几个得到结果 Ctrl+C退出

shell脚本中如何使用:
  echo "3.5+6.5" | bc        a=3.5;b=6.5;echo "$a+$b" | bc

保留xx位小数:可以用scale命令 示例: scale = 2

  注意:
    scale只对乘幂/除法/取余 有效,对加/减 无效,加减可以通过对运算结果 乘1或除1 的方式来保留指定小数位,示例:echo "scale=2;(3.5+6.5)/1" | bc
    整数位如果是零:echo "scale=2;(0.2+0.3)/1" | bc  输出结果是  .50 而不是 0.50
    

 

 


 shell脚本的常见条件判断

[ 条件判断表达式 ]
一般情况下可以和 && || 进行配合使用 如果true && 如果false ||

文件/文件夹或路径的判断
  -e  目标是否存在(exist)  [ -e demo.sh ] && echo '存在' [ -e demoxx.sh ] || echo '不存在'
  -d  是否是路径或文件夹(directory)  [ -d /test ] && echo '路径存在'
  -f  是否是文件(file)  [ -f demo.sh ] && echo '是文件'
权限的判断
  -r  是否有读取权限(read)  [ -r shell.sh ] && echo '有读取的权限'
  -w  是否有写入权限(write)  [ -w shell.sh ] && echo '有写入的权限'
  -x  是否有执行权限(excute)  [ -x shell.sh ] || echo '没有执行的权限'
整数型(int)的判断
  -eq  等于(equal)  [ 1eq2 ] && echo '1不等于2'  a=1;b=2;[ aeqb ] && echo 'a不等于b'
  -ne  不同于(not equal)
  -gt  大于(greater than)
  -lt  小于(lesser than)
  -ge  大于等于(greater or equal)
  -le  小于等于(lesser or equal)
小数型(浮点型)的判断
  利用bc计算进行判断 bc 计算机支持浮点型判断 如果比较正确返回1,否则返回0,利用这一点,我们实现在shell脚本中对浮点型进行判断
  示例: [ `echo "7.2 < 8"|bc` -eq 1 ] && echo 'ture'
字符串的判断
  =   相等  [ 'a'='a' ] && echo '等于'
  !=  不相等  [ 'a'='b' ] && echo '不等于'




panduan.sh(比较两个整数的大小的脚本)
  

#!/bin/bash
#参数1与参数2做比较
#by FJT create by 2020/04/19
if [ $1 -eq $2 ]
then
echo "$1等于$2"
else
echo "$1不等于$2"
fi

 

createFile.sh(创建文件的脚本)

#!/bin/bash
#创建文件或文件夹的shellscript
#by FJT 2020/04/19
touch $1
if [ $? -eq 0 ];then
echo "$1 创建成功!!!"
else
echo "$1 创建失败!!!!!"
fi

 

 

 shell脚本的输入/输出(特效效果)

1.输入命令read:  shell script 中的语法:read -p "请输入密码:" -s -t "5" (类似于html中的input)  read后携带的常用参数主要有:

   -p  : 提示信息,默认不支持"\n"换行 (read -p "请输入密码")
   -s  : 隐藏输入的内容,例如输入密码的时候 (read -s)
   -t  : 设置等待时间,超时会自动退出read输入 ,秒(read -t "5")
   -n  : 设置读取字符的个数,触发临界值会自动执行read输入 (read -n "8")
  注意:  
    脚本书写:read.sh,说明 param即传入的参数,这个变量可以随意定义,如pass,p......
    脚本中换行操作:echo -e "\n"

  
第一种脚本输入方式(read)
 

#!/bin/bash
#功能描述:用来测试输入命令read
#by fjt 2020-04-20
read -p "请输入密码:" -s -t 5 -n 7 param

echo -e "\n"
echo "$param"

第二种脚本输入方式(read)

#!/bin/bash
#功能描述,输入命令read的第二种方式
#by fjt 2020-04-20
echo "请输入用户名:"
read usr
echo -e "\n"
echo "您输入的用户名是:$usr"

第三种脚本输入方式($n):换行操作(echo -e "\n")
panduan.sh(比较两个整数的大小的脚本)

#!/bin/bash
#参数1与参数2做比较
#by FJT create by 2020/04/19
if [ $1 -eq $2 ]
then
echo "$1等于$2"
else
echo "$1不等于$2"
fi

 

2.语法: echo -e "\033[字背景颜色;字体颜色;特效字符串\033[关闭属性"

	#字体色范围:30-37
		echo -e "\033[30m 黑色字 \033[0m"
		echo -e "\033[31m 红色字 \033[0m"
		echo -e "\033[32m 绿色字 \033[0m"
		echo -e "\033[33m 黄色字 \033[0m"
		echo -e "\033[34m 蓝色字 \033[0m"
		echo -e "\033[35m 紫色字 \033[0m"
		echo -e "\033[36m 天蓝字 \033[0m"
		echo -e "\033[37m 白色字 \033[0m"
	#字背景颜色范围:40-47
		echo -e "\033[40;37m 黑底白字 \033[0m"
		echo -e "\033[41;30m 红底黑字 \033[0m"
		echo -e "\033[42;34m 绿底蓝字 \033[0m"
		echo -e "\033[43;34m 黄底蓝字 \033[0m"
		echo -e "\033[44;30m 蓝底黑字 \033[0m"
		echo -e "\033[45;30m 紫底黑字 \033[0m"
		echo -e "\033[46;30m 天蓝底黑字 \033[0m"
		echo -e "\033[47;34m 白底蓝字 \033[0m"
	# 特效范围
		echo -e "\033[0m 无任何特效 \033[0m"
		echo -e "\033[1m 高亮度 \033[0m"
		echo -e "\033[4m 下划线 \033[0m"
		echo -e "\033[5m 闪烁 \033[0m"

  

处理海量数据常用命令

grep、cut、awk、sed 常用于查找日志、数据、输出结果等等,并对我们想要的数据进行提取,
通常grep、sed命令是对行进行提取,cut、awk是对列进行提取。

 

处理海量数据值grep

使用场景:grep应用场景:通常对数据进行 行的提取。
使用语法:grep [选项]...[内容]...[file]
常用的选项如下:
	-v 	#对内容进行取反提取

	-n 	#对提取的内容显示行号

	-w 	#精确匹配

	-i 	#忽略大小写

	^ 	#匹配开头行首

	-E 	#正则匹配

处理海量数据值cut

应用场景:通常对数据进行列的提取。
使用语法:语法:cut [选项]...[file]
常用语法如下:
            -d     #指定分割符
            -f  #指定截取区域
            -c  #以字符为单位进行分割

            注意:不加-d选项,默认为制表符,不是空格
                    /bin/bash         #代表可以登录的用户
                    /sbin/nologin    #代表不可以登录的用户

            -d与-f:
            eg:以':'为分隔符,截取出/etc/passwd的第一列跟第三列
            cut -d ':' -f 1,3 /etc/passwd

            eg:以':'为分隔符,截取出/etc/passwd的第一列到第三列
            cut -d ':' -f 1-3 /etc/passwd

            eg:以':'为分隔符,截取出/etc/passwd的第二列到最后一列
            cut -d ':' -f 2- /etc/passwd

            -c:
            eg:截取/etc/passwd文件从第二个字符到第九个字符
            cut -c 2-9 /etc/passwd
eg:比如领导想叫你截取linux上面所有可登陆普通用户
grep '/bin/bash' /etc/passwd | cut -d ':' -f 1 | grep -v root
 

 

推荐阅读