zoukankan      html  css  js  c++  java
  • 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:] 大写字符
    =========案例========

       

       

        

  • 相关阅读:
    大道至简第二章读后感
    读大道至第一章简有感
    二次封装Response类
    视图与序列化传参
    Codeforces Round #523 (Div. 2) F. Katya and Segments Sets (交互题+思维)
    Codeforces Round #510 (Div. 2) D. Petya and Array(离散化+反向树状数组)
    Codeforces 1060E(思维+贡献法)
    Codeforces Round #520 (Div. 2) E. Company(dfs序判断v是否在u的子树里+lca+线段树)
    Codeforces Round #513 by Barcelona Bootcamp C. Maximum Subrectangle(双指针+思维)
    Educational Codeforces Round 51 F. The Shortest Statement(lca+最短路)
  • 原文地址:https://www.cnblogs.com/xiaocheche/p/7601073.html
Copyright © 2011-2022 走看看