linux中shell的使用

vampire 2020年09月15日 17次浏览

正则表达式

\   转义
^   一行的开头
    ^R------表示以R开头的行
$   匹配一行的结束
    R$表示以R结尾的行
*   表示上一个子式匹配0次或多次,贪心匹配
    Zo*-----
            Z
            Zo
            Zooo
.   匹配一个任意的字符
    .*匹配任意字符串
[]  表示匹配某个范围内的字符
    [a-z]------匹配一个a-z之间的字符
    [a-z]*-----匹配任意字母字符串

shell

shell解释器

/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
  • 脚本格式

    #!/bin/bash
    echo "helloword"
    
  • 执行方式

    * bash+脚本 / sh+脚本
    * 直接输入脚本(增加可执行权限+x)
    

变量

  • 系统变量

    $HOME、$PWD、$SHELL、$USER
    set //显示当前所有变量
    
  • 自定义变量

    * 基本语法
    	变量=值
    	unset 变量
    	声明静态变量:readonly 变量
    	export 变量名:全局变量名
    * 规则
    	(1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。
    	(2)等号两侧不能有空格
    	(3)在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。
    	(4)变量的值如果有空格,需要使用双引号或单引号括起来。
    
  • 特殊变量

    • $ n

      * 基本语法
      	$n	(功能描述:n为数字,$0代表该脚本名称,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10})
      
    • $#

      * 基本语法
      	$#	(功能描述:获取所有输入参数个数,常用于循环)。
      
    • $*

      * 基本语法
      	$*	(功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
      
    • $@

      * 基本语法
      	$@	(功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
      
    • $?

      * 基本语法
      	$?	(功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)
      

运算符

* 基本语法
	(1)“$((运算式))”或“$[运算式]”
	(2)expr  + , - , \*,  /,  %    加,减,乘,除,取余

条件判断

* 基本语法
	[ condition ](注意condition前后要有空格)
	注意:条件非空即为true,[ atguigu ]返回true,[] 返回false。
* 常用判断条件
	(1)两个整数之间比较
		= 字符串比较
		-lt 小于(less than)			
		-le 小于等于(less equal)
		-eq 等于(equal)				
		-gt 大于(greater than)
		-ge 大于等于(greater equal)	
		-ne 不等于(Not equal)
	(2)按照文件权限进行判断
		-r 有读的权限(read)			
		-w 有写的权限(write)
		-x 有执行的权限(execute)
	(3)按照文件类型进行判断
		-f 文件存在并且是一个常规的文件(file)
		-e 文件存在(existence)		
		-d 文件存在并是一个目录(directory)
	(4)多条件判断
		&&

流程控制

  • 基本语法

    • if语句

      if [ 条件判断式 ] 
        then 
          程序 
      elif [ 条件判断式 ]
      	then
      		程序
      else
      	程序
      fi
      # 注意事项:
      	#(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格
      	# (2)if后要有空格
      
    • case语句

      case $变量名 in 
        "值1") 
          如果变量的值等于值1,则执行程序1 
          ;; 
        "值2") 
          如果变量的值等于值2,则执行程序2 
          ;; 
        …省略其他分支… 
        *) 
          如果变量的值都不是以上的值,则执行此程序 
          ;; 
      esac
      
      
    • for 循环

      for (( 初始值;循环控制条件;变量变化 )) 
        do 
          程序 
        done
      
      for 变量 in 值1 值2 值3… 
        do 
          程序 
        done
      
      # eg:
      	s=0
      	for((i=0;i<=100;i++))
      	do
      		s=$[$s+$i]
      	done
      	echo $s
      
    • while 循环

      while [ 条件判断式 ] 
        do 
          程序
        done
      

read读取控制台输入

read(选项)(参数)
选项:
	-p:指定读取值时的提示符;
	-t:指定读取值时等待的时间(秒)。
参数
	变量:指定读取值的变量名
# eg
	#!/bin/bash
	read -t 7 -p "Enter your name in 7 seconds " NAME
	echo $NAME

函数

  • 系统函数

    1. basename

      basename [string / pathname] [suffix]  	
      	(功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。
      选项:
      	suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。
      
    2. dirname

      dirname 文件绝对路径		
      	(功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))
      
  • 自定义函数

    1. 基本语法

      [ function ] funname[()]
      {
      	Action;
      	[return int;]
      }
      funname
      
    2. 注意事项

      (1)必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其它语言一样先编译。
      (2)函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255)
      
      

shell工具

  • cut

    cut [选项参数]  filename
    说明:默认分隔符是制表符
    选项参数说明:
    	-f: 列号,提取第几列
    	-d: 分隔符,按照分隔符分隔列
    	-c: 指定具体的字符
    
  • sed

    sed [选项参数]  ‘command’  filename
    选项参数:
    	-e: 直接在指令列模式上进行sed的动作编辑。
    	-i: 直接编辑文件
    命令功能:
    	a: 新增,a的后面可以接字串,在下一行出现
    	d: 删除
    	s: 查找并替换 
    
  • awk

    awk [选项参数] ‘pattern1{action1}  pattern2{action2}...’ filename
    pattern:表示AWK在数据中查找的内容,就是匹配模式
    action:在找到匹配内容时所执行的一系列命令
    
    选项参数说明:
    	-F: 指定输入文件折分隔符
    	-v: 赋值一个用户定义变量
    内置变量
    	FILENAME	文件名
    	NR	已读的记录数
    	NF	浏览记录的域的个数(切割后,列的个数)
    
  • sort

    sort (选项)(参数)
    选项:
    	-n	依照数值的大小排序
    	-r	以相反的顺序来排序
    	-t	设置排序时所用的分隔字符
    	-k	指定需要排序的列