Shell编程

Shell元字符(正则表达式)

    元字符	      作 用
    *	          前一个字符匹配 0 次或任意多次
    .	          匹配除换行符外的任意一个字符
    ^	          匹配行首。例如,^hello 会匹配以 hello 开头的行
    $	          匹配行尾。例如,hello& 会匹配以 hello 结尾的行
    []	          匹配屮柄号屮指定的任意一个字符,而且只匹配一个字符。例如.[aoeiu]匹配任意一个元音字母, [0-9] 匹配任意一位数字,[a-z][0-9] 匹配由小写字母和一位数字构成的两位字符
    [^]	          匹配除中括号中的字符以外的任意一个字符。例如,[^0-9] 匹配任意一位非数字字符,[^a-z] 匹配任意一位非小写字母
    \	          转义符,用于取消特殊符号的含义
    \{n\}	      表示其前面的字符恰好出现 n 次。例如,[0-9]\{4\} 匹配4位数字,[1][3-8][0-9]\{9\} 匹配手机号码
    \(n,\}	      表示其前面的字符出现不少于 n 次。例如,[0-9]\{2,\} 匹配两位及以上的数字
    \{n,m\}	      表示其前面的字符至少出现 n 次,最多出现 m 次。例如,[a-z]\{6,8\} 匹配 6〜8 位的小写字母

Shell cut命令:查找符合条件的行,并且提取出来

    与grep命令不同的是,grep命令只是将符合条件的内容查找出来,并不会做其他什么操作。而cut命令会将内容提取
    cut [选项] 文件名
    -f 列号:提取第几列
	   注意:cut 命令的默认分隔符是制表符,也就是 Tab 键,对空格符支持得不怎么好,若要使用其他分隔符需要和[-d 选项]一起使用,通过-d声明指定的分隔符
    -d 分隔符:按照指定分隔符分割列
    -c 字符范围:不依赖分隔符来区分列,而是通过字符范围(行首为 0)来进行字段提取。"n-"表示从第 n 个字符到行尾;"n-m"表示从第 n 个字符到第 m 个字符;"-m"表示从第 1 个字符到第 m 个字符;
	
	例子: 
	存在student.txt文件 
	    id name sex
		1 james m
		2 jack m
		3 rose f
		
		命令: cut -d " " -f 2,3 ./student.txt      
		输出结果表示:以空格为分隔符截取第二列和第三列的内容
		结果:
		name sex
		james m
		jack m
		rose f

Shell printf格式化输出命令

    和print区别是:print 会在每个输出之后自动加入一个换行符;而 printf 是标准格式输出命令,并不会自动加入换行符,如果需要换行,则需要手工加入换行符
    printf '输出类型输出格式' 输出内容
	
    %ns:输出字符串。n 是数字,指代输出几个字符
    %ni:输出整数。n 是数字,指代输出几个数字‘’
    %m.nf: 输出浮点数。m 和 n 是数字,指代输出的整数位数和小数位数。如 %8.2f 代表共输出 8 位数,其中 2 位是小数,6 位是整数	

    \a: 输出警告声音
    \b:输出退格键,也就是 Backspaced 键
    \f:清除屏幕
    \n:换行
    \r:回车,也就是 Enter 键
    \t:水平输出退格键,也就是 Tab 键
    \v:垂直输出退格键,也就是 Tab 键	
	
	例子:
	存在文本文件:student.txt
	   id name gender
		1 james m
		2 jack m
		3 rose f
	命令 printf '%s\n\t' $(cat ./student.txt)	
	结果: 
            id
          name
         gender
             1
         james
             m
             2
          jack
             m
             3
          rose
             f

Shell awk命令详解(格式+使用方法)

    相比较于cut,awk的特点是无论是空格还是tab键分隔符都可以被识别,而cut却做不到这一点
    awk '条件1 {动作 1} 条件 2 {动作 2} …' 文件名
	
	条件类型	         条 件	     说 明
    awk保留字	     BEGIN	     在 awk 程序一开始,尚未读取任何数据之前执行。BEGIN 后的动作只在程序开始时执行一次
    awk保留字	     END	     在 awk 程序处理完所有数据,即将结束时执行?END 后的动作只在程序结束时执行一次
    关系运算符	     >	         大于
                     <	         小于
                     >=	         大于等于
                     <=	         小于等于
                     ==	         等于。用于判断两个值是否相等。如果是给变童赋值,则使用"=”
                     !=	         不等于
                     A~B	     判断字符串 A 中是否包含能匹配 B 表达式的子字符串
                     A!~B	     判断字符串 A 中是否不包含能匹配 B 表达式的子字符串
    正则表达式	     /正则/	     如果在“//”中可以写入字符,则也可以支持正则表达式

shell sed命令详解:选取、替换、删除、新増数据(可以从管道这样的标准输入中接收的数据进行编辑)

    sed [选项] '[动作]' 文件名
	-n:一般 sed 命令会把所有数据都输出到屏幕上。如果加入此选项,则只会把经过 sed 命令处理的行输出到屏幕上
    -e: 允许对输入数据应用多条 sed 命令编辑
    -f 脚本文件名:从 sed 脚本中读入 sed 操作。和 awk 命令的 -f 选项非常类似
    -r:在 sed 中支持扩展正则表达式
    -i:用 sed 的修改结果直接修改读取数据的文件,而不是由屏幕输出动作
    a \:追加,在当前行后添加一行或多行。当添加多行时,除最后一行外,每行末尾需要用“\”代表数据未完结
    c \:行替换,用c后面的字符串替换原数据行。当替换多行时,除最后一行外,每行末尾需用“\”代表数据未完结
    i \:插入,在当前行前插入一行或多行。当插入多行时,除最后一行外,每行末尾需要用“\”代表数据未完结
    d:删除,删除指定的行
    P:打印,输出指定的行
    s:字符串替换,用一个字符串替换另一个字符串。格式为“行范围s/旧字串/新字串/g”(和Vim中的替换格式类似)

Linux sort命令详解:字符串排序

   可以依据不同的数据类型来进行排序。sort 将文件的每一行作为一个单位,相互比较。比较原则是从首字符向后,依次按 ASCII 码值进行比较,最后将它们按升序输出
   
   sort [选项] 文件名
   选项:
       -f:忽略大小写
       -b:忽略每行前面的空白部分
       -n:以数值型进行排序,默认使用字符串排序
       -r:反向排序
       -u:删除重复行。就是 uniq 命令
       -t:指定分隔符,默认分隔符是制表符
       -k [n,m]:按照指定的字段范围排序。从第 n 个字段开始,到第 m 个字(默认到行尾)

Linux wc命令:统计指定文件中的字节数、字数、行数

  wc [选项] 文件名
      选项:
        -l:只统计行数
        -w:只统计单词数
        -m:只统计字符数	 
	
	例子:统计服务器有多少正常连接        netstat -an | grep ESTABLISHED | wc -l

Shell test命令:条件判断,检查某条件是否成立 (条件判断式)

按照文件类型进行判断	
   测试选项	         作 用
   -b 文件	         判断该文件是否存在,并且是否为块设备文件(是块设备文件为真)
   -c 文件	         判断该文件是否存在,并且是否为字符设备文件(是字符设备文件为真)
   -d 文件	         判断该文件是否存在,并且是否为目录文件(是目录文件为真)
   -e 文件	         判断该文件是否存在(存在为真)
   -f 文件	         判断该文件是否存在,井且是否为普通文件(是普通文件为真)
   -L 文件	         判断该文件是否存在,并且是否为符号链接文件(是符号链接文件为真〉
   -p 文件	         判断该文件是否存在,并且是否为管道文件(是管道文件为真)
   -s 文件	         判断该文件是否存在,并且是否为非空(非空为真)
   -S 文件	         判断该文件是否存在,并且是否为套接字文件(是套接字文件为真〉
   	   
   例子:判断当前目录是否存在,(其实你都已经在当前目录了,那么判断结果肯定为真)
        test -e ./
		
		上面的命令并没有返回东西,如何获取到命令的结果呢?
		通过查看$?预定义变量,即可获取命令的判断结果(结果: 0为真,非0为假)
		命令: echo $?
        结果: 0
					
按照文件权限进行判断
   测试选项	         作 用    (注意:只能判断权限,并不能判断权限所属的用户的身份)
   -r 文件	         判断该文件是否存在,并且是否拥有读权限(有读权限为真)
   -w 文件	         判断该文件是否存在,并且是否拥有写权限(有写权限为真)
   -x 文件	         判断该文件是否存在,并且是否拥有执行权限(有执行权限为真)
   -u 文件	         判断该文件是否存在,并且是否拥有SUID权限(有SUID权限为真)
   -g 文件	         判断该文件是否存在,并且是否拥有SG1D权限(有SGID权限为真)
   -k 文件	         判断该文件是否存在,并且是否拥有SBIT权限(有SBIT权限为真)			
	
两个文件之间进行比较    
   测试选项	         作 用
   文件1 -nt 文件2	 判断文件1的修改时间是否比文件2的新(如果新则为真)
   文件1 *ot 文件2	 判断文件1的修改时间是否比文件2的旧(如果旧则为真)
   文件1 -ef 文件2	 判断文件1是否和文件2的inode号一致,可以理解为两个文件是否为同一个文件。这个 判断用于判断硬链接是很好的方法	
   
两个整数之间进行比较
   测试选项	         作 用
   整数1 -eq 整数2	 判断整数 1 是否和整数 2 相等(相等为真)
   整数1 -ne 整数2	 判断整数 1 是否和整数 2 不相等(不相等为真)
   整数1 -gt 整数2	 判断整数 1 是否大于整数 2 (大于为真)
   整数1 -lt 整数2	 判断整数 1 是否小于整数 2(小于为真)
   整数1 -ge 整数2	 判断整数 1 是否大于等于整数 2 (大于等于为真)
   整数1 -le 整数2	 判断整数 1 是否小于等于整数 2(小于等于为真)	
   
   例子:判断整数100 是否大于整数99
   命令: test 100 -ge 99 && echo "yes" || ehco "no"
      或者:[ 100 -ge 99 ] && echo "yes" || echo "no"

字符串判断
   测试选项	         作 用
   -z 字符串	         判断字符串是否为空(为空返回真)
   -n 字符串	         判断宇符串是否为非空(非空返回真)
   字串1 = 字串2	 判断字符串 1 是否和字符串 2 相等(相等返回真)
   字串1 != 字串2	 判断字符串 1 是否和字符串 2 不相等(不相等返回真)		
   
   例子:定义变量并且赋值(变量赋值默认为字符串),判断该变量是否为空
   命令:name=stephen
       echo $name
	   test -z name 或者 [ -z name ]
	   echo $?
	   
多重条件判断
   测试选项	         作 用
   判断1 -a 判断2	 逻辑与,判断 1 和判断 2 都成立,最终的结果才为真
   判断1 -o 判断2	 逻辑或,判断 1 和判断 2 有一个成立,最终的结果就为真
   ! 判断	         逻辑非,使原始的判断式取反	
   例子:判断name变量是否为空,判断age变量的值是否大于18
         name=stephen
		 declare -i age=19
		 test -n "$name" -a "$age" -gt 18
		 [ -n "$name" -a "$age" -gt 18 ] && echo "yes" || echo "no"

Shell if 条件判断语句及其用法

单分支 if 条件语句
    if [条件判断式];then
    程序
    fi			 
    
    注意:[条件判断式] 就是使用 test 命令判断,所以中括号和条件判断式之间必须有空格。
    df -h | grep "/dev/sda1" | awk '{print $5}' | cut -d "%" -f 1
	
双分支if条件语句
    if [条件判断式]
    then
    当条件判断式成立时,执行的程序
    else
    当条件判断式不成立时,执行的另一个程序
    fi	
	
多分支if条件语句
    if[条件判断式1]
    then
    当条件判断式1成立时,执行程序1
    elif [条件判断式2]
    then
    当条件判断式2成立时,执行程序2
    …省略更多条件...
    else
    当所有条件都不成立时,最后执行此程序、
    fi

Shell case 多分支条件判断

    case $变量名 in
    "值 1")
    ;;
    如果变量的值等于值1,则执行程序1,值
    2")
    如果变量的值等于值2,则执行程序2
    …省略其他分支…
    *)
    如果变量的值都不是以上的值,则执行此程序
    ;;
    esac
	
	例子:获取用户输入,并对用户输入做判断
    read -t 30 -p "please user enter something:" str
    case $str in
    "yes")
    echo "user have entered yes"
    ;;
    "no")
    echo "user have entered no"
    ;;
    *)
    echo "user entered wrong message"
    ;;
    esac

Shell for循环的使用详解

    for 变量 in 值1 值2 值3…
    do
    程序
    done
	
	

    for ((初始值;循环控制条件;变量变化))
    do
    程序
    done	
    例子:for循环从1+2+3...+99+100		
  	for((i= 1;i<=100;i=i+1))
    do
    s=$(($s+$i))
    done
    echo "1+2+3...+99+100="$s	

Shell while 循环及其用法

   while [条件判断式]  (注意:while和条件判断式之间存在一个空格,还有就是条件判断式两边的空格)
   do
   程序
   done	
   
   对于 while 循环来讲,只要条件判断式成立,循环就会继续;一旦条件判断式不成立,循环就会停止
   
   例子:for循环从1+2+3...+99+100		
   echo "use while to test 1 plus to 100"
   i=1
   s=0
   while [ $i -le 100 ]
   do
   s=$(($s+$i))
   i=$(($i+1))
   done
   echo "1+2+3+...+99+100=$s"

Shell until循环及其用法

  until [条件判断式]
  do
  程序
  done
  
  对于 until 循环来讲,只要条件判断式不成立,循环就会继续;一旦条件判断式成立,循环就会停止
  例子:for循环从1+2+3...+99+100		
  x=1
  y=0
  until [ $x -ge 101 ]
  do
  y=$(($y+$x))
  x=$(($x+1))
  done
  echo "1+2+3+...+99+100=$y"

Shell函数及其用法

 function 函数名(){
    程序
 }	  
 函数也有自己的位置参数变量,$0 代表函数名,$1 代表函数的第 1 参数,$2 代表函数的第 2 个参数,以此类推
 
 例子:重写1-100的加法运算,使用函数
 function sum(){
    s=0
	for((i=1;i<=$1;i=i+1))  #循环框为双括号
	do
	  s=$(($i+$s))
	done
	
	echo "1+2+3+...+$1=$s"
 }
 
 read -t 30 -p "please enter a number:" num
 y=$(echo $num | sed 's/[0-9]//g')
 if [ -z "$y" ];then
 sum $num
 else
 echo "please enter a valid number"
 fi

Shell exit流程控制语句及用法

  在linux命令中exit命令代表退出当前登录,而在shell脚本中,exit代表退出当前脚本
  exit [返回值]
        (返回值可以由$?命令查看) 
  
  例子:利用exit退出脚本,并且定义返回值
    read -t 30 -p "please enter a number:" num
    y=$(echo $num | sed 's/[0-9]//g')	
    [ -n "$y" ] && echo "Error! please enter a number" && exit 500
    echo "user entered the number is:$num"  		

Shell break和continue循环控制语句及其用法

  break和continue都可以用来退出循环,而它们之间的不同之处在于,break退出的是当前整个循环,而continue退出的是单次当前循环
  break例子:
     for((i=1;i<=10;i=i+1))
	 do
	 if [ "$i" -eq 5 ];then
	 break
	 fi
	 echo "current number is:$i"
	 done
	 

  continue例子:	 
     for((i=1;i<=10;i=i+1))
	 do
	 if [ "$i" -eq 5 ];then
	 continue
	 fi
	 echo "current number is:$i"
	 done
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值