Shell脚本基础

========BASH功能介绍
1》命令历史:可以通过history命令查看历史命令,所有的命令历史都有记录编号,命令历史能够记录的信息数量由/etc/profile文件中的HISTSIZE的值来决定,默认为                           1000;

2》命令别名:可以把本来很长的指令简化缩写,为常用且复制的命令及选项创建别名可以大大提高日常工作效率;
        alias mkip=`vim /etc/sysconfig/network-scripts/ifcfg-eth0`
        unalias mkip

3》管道与重定向:标准输入的文件描述符为0,标准输出的文件描述符为1,错误输出的文件描述符为2;
       相关命令:echo “pass” |passwd --stdin tom
          mail -s test xx@gmail.com <list.txt 发送邮件,邮件内容来自文件
          ls -l abc install.log 2>error.txt 仅将错误重定向,不影响正确输出
          ls -l abc install.log >all 2>&1 标准输出与错误输出均导入至all
          ls -l abc install.log &> all
          ls -l abc install.log >> all 2>&1 标准输出与错误输出均追加至all      

  =========BASH使用技巧
1》重定向技巧:
     相关命令: echo “pass” |passwd --stdin root >/dev/null
           id user1 >>user 2>>error 查看用户,如果用户存在则输出至user,否则输出至error
2》命令序列使用技巧:在linux中,我们可以使用控制字符(;&& || &)来控制命令的执行方式,其中&控制字符使得命令开启一个子shell,并在后台执行;使用;控制                                      字符可以把多个命令组合,按顺序执行;使用&&控制字符也可以将多个命令组合,但仅当前一个命令执行成功后才会执行&&控制符后面的命                                          令;||控制字符的作用与&&刚好相反,仅当前一个命令执行失败才会执行控制符后面的命令;
     相关命令: firefox &
           ls /tmp; ls /root; ls /home
           ls test.txt && cat test.txt
           gedit || vim
           id tom &> /dev/null && echo “hi ,tom” || echo “no such user”
3 》作用控制技巧:
     相关命令: firefox &
           jobs 查看后台进程,并给每个进程分配一个编号
           fg 1 将后台进程再次调入前台执行          

4》花括号使用技巧:

     

===================变量=====================
定义:变量是用来存储非固定值的载体,它具有一个值,以及零个或多个属性,变量名称为字母,下划线以及数字的组合,但首字母不可以为数字,我们可以通过                    typeset命令来为变量设置属性;
   相关命令:
        NAME=tomcat
        typeset -r NAME 添加readonly属性
        declare INT_NUMBER 预先定义一个变量,但暂时不赋值给它
        typeset -i INT_NUMBER 设置整数变量
        read -p “please input a number:” P_NUMBER
        set 查看当前系统中设置的所有变量和值
        unset P_NUMBER 删除变量
   ******export 命令可以将一个普通变量转换为环境变量;

1》环境变量:BASH预设了很多环境变量,在实际工作中我们可以直接调用这些变量; 

2》位置变量:位置变量使得在脚本中的命令可以调用运行脚本时不同位置的参数,参数一般使用空格分割,$0代表当前SHELL程序的文件名称,$1代表运行SHELL程                       序的第一个参数,以此类推(范围为$1-$9)使用位置变量可以有助于我们查看很多相关信息,$#代表SHELL程序所有的参数的个数;$* $ @代表所有参                      数的内容,不同的是前者将其看作一个整体,后者将所有参数分别作为个体看待;$$ 代表当前进程的ID号码;$?表示命令的执行反馈(0代表命令执行成                     功,非0代表命令执行失败);
3》数组:一般可以使用两种方式创建数组变量,第一种使用name[subscript]=value的语法格式定义的变量自动创建索引数组,subscript 必须是大于或等于0的整数或                  表达式;第二种使用name=(value1 value 2 valuen)的语法格式创建,使用declare -a name 可以预定义一个空数组变量;我们最后使用${name[subscript]}来                调用数组,如果subscript 是 @或者 *符号,则将调用所有的数组成员,使用${#name[sbuscript]}可以返回该数组成员的长度,如果subscript是@或*,则返回                数组中成员的个数;

                   

                   

4》算术运算与测试:使用$((expression)) 可以实现整数级的算术运算; 


          $((x+y)) 加法运算
          $((x-y)) 减法运算
          $((x/y)) 除法运算,结果仅保留整数位
          $((x*y)) 乘法运算
          $((x%y)) 取余运算
          $((x++)) 自加运算
          $((x--)) 自减运算
          $((x**y)) 幂运算,x 的y次方
  *****BASH内置命令test可实现测试工作;

  -d FILE   文件是否存在,且为目录
  -e FILE   文件是否存在
  -f File      文件是否存在,且为普通文件
  -w FILE   文件是否存在,且可写
  -r FILE    文件是否存在,且可读
  -x FILE   文件是否存在,且可执行
  -h FILE   文件是否为链接文件
  -s FILE   文件是否存在且非空
  -n STRING   字符串长度非0
  -z STRING   字符串长度为0
  STRING1 != STRING 2   字符串不相等
  STRING 1 = STRING2    字符串相等
  INTER1 -eq INTER2       前者等于后者
  INTER1 -gt INTER2        前者大于后者
  INTER1 -ge INTER2       前者大于等于后者
  INTER1 -le INTER2        前者小于后者
  INTER1 -lt INTER2         前者小于等于后者
  INTER1 -ne INTER2       前者不等于后者   

  *****test -d /etc/ && echo “Y” || echo “N”

====================SHELL引号

1》反斜线:反斜线可以将紧随其后的单个字符视为字面意义上的字符,列如*会把*作为字母意义上的普通字符;另外,如果在命令的末尾使用回车后,可以将回车的                    命令提交功能屏蔽,从而将回车认为是换行继续输入命令,实现命令的多行输入功 能;
2》单引号:单引号可以将它中间的所有任意字符还原为字面意义,实现屏蔽SHELL元字符的功能,注意:不可以在两个单引号中间单独插入一个单引号,单引号必须                      成对出现;

            

3》双引号:双引号类似于单引号,但其不会屏蔽 `,,$这三个SHELL元字符的含义,如果需要屏蔽这些字符含义,必须前置一个符号,其他字符的功能将被屏蔽                        (包括单引号),也就是说,两个双引号之间的单引号不必成对出现;

             

4》反引号:SHELL使用反引号进行命令替换,命令替换使SHELL可以将命令字符替换为命令执行结果的输出内容,同样的功能也可以使用$()来实现;

              

===============正则表达式
注意:正则表达式中有些匹配字符与SHELL中的通配字符符号一样,但含义不一样;

1》基本正则表达式:
  . 匹配任意单个字符
  * 匹配前一个字符出现零次或多次
  .* 匹配任意多个任意字符
  [] 匹配集合中的任意单个字符,括号中为一个集合
  [x-y] 匹配连续的字串范围
  ^ 匹配字串的开头
  $ 匹配字串的结尾
  [^] 匹配否定,对括号中的集合取反
   匹配转义后的字串
  {n,m} 匹配前一个字符重复n 到 m次
  {n,} 匹配前一个字符至少重复n次
  (n) 匹配前一个字符重复n次
  () 将( 与)之间 的内容存储在保留空间,最大存储9个
   通过1至9调用保留空间的内容

************基本正则表达式案例

1》查找包含root的行:

      

2》 查找:与0:之间包含任意两个字符的字串,并显示该行(--color代表以颜色加亮显示匹配的内容:):                 

         

  3》查出包含至少一个0的行(第一个0必须出现,第二个0可以出现0次或多次):

        

4》查找包含oot 或 ost的行:

        

5》查找包含数字0-9的行:

       

6》查找包含字母f-g的行:

         

7》查找以root 开头或者以 bash结尾的行:

       

8》查找sbin/后面不跟n的行:

        

9》查找数字0出现1次,2次的行:

       

 10》查找包含两个root的行(注意:grep在使用()过滤时,匹配条件必须使用引号):

      

11》查找包含以root: 开头,以:root结尾的字串行:

       

12》过滤文件的空白行,空滤文件的非空白行:

     

==========扩展正则表达式

1》扩展正则表达式及含义:
  {n,m} 等同于基本正则表达式的{n,m}
  + 匹配前一个字符出现一次或者多次
  ? 匹配前一个字符出现零次或一次
  | 匹配逻辑或者,即匹配前或后的字串
  0 匹配正则集合
2》扩展正则表达式案例:
  1)查找数字0出现一次和两次的行:
    egrep --color ‘0{1,2}’ test
  2)查找包含至少一个0 的行:
    egrep --color ‘0+’ test
  3)查找包含以root 开头或者以 bash结尾的行:

                

=================POSIX规范:
  [:alpha:] 字母字符
  [:digit:] 数字字符
  [:alnum:] 字母与数字字符
  [:punct:] 标点符号
  [:space:] 任何产生空白的字符
  [:blank:] 空格与TAB键字符
  [:lower:] 小写字符
  [:upper:] 大写字符
=========案例========

   

   

    

原文地址:https://www.cnblogs.com/xiaocheche/p/7601073.html