zoukankan      html  css  js  c++  java
  • Linux 中shell 学习笔记

    SHELL学习笔记

    1. Bash 变量

    1.1 什么是变量与变量分类

      变量是计算机内存的单元,其中存放的值可以改变;

      变量让你能够把程序中准备使用的每一段数据都赋给一个简短、易于记忆的名字,因此他们十分有用

    1.2 变量的命名规则

    • 变量名必须以字母或下划线大头,名字中间只能由字母、数字和下划线组成
    • 变量名的长度不得超过255个字符
    • 变量名在有效的范围内必须是唯一的
    • 在Bash中,变量的默认类型都是字符串型

      1.3 变量的分类

    • 用户自定义变量。变量自定义的

    变量名=变量值

    例如:

      x=5;

      name=“jie cao”

    变量的调用:

      echo $x

      echo $name

    变量的叠加

      x=123

      x=“$x”456   或者   x=${x}789

      x=$x         #x=123456

    变量调用

      $x

      $name

    删除变量

      unset 变量名

      unset x

    变量查看

      set [选项]      -u:如果设定此选项,调用未声明变量时会报错(默认无任何提示)

    • 环境变量:这种变量中主要保存的是和系统操作环境相关的数据。变量可以自定义,但是对系统生效的环境变量名和变量作用是固定的

    环境变量与用户自定义变量的区别

      环境变量是全局变量

      用户自定义变量是局部变量

    自定义环境变量

      export 变量名=变量值  或者   变量名=变量值;export 变量名

    查看环境变量

      set   #查看所有变量

      env  #查看环境变量

    删除变量

      unset 变量名

    常用环境变量

      HOSTNAME:主机名

      SHELL:当前的shell

      TERM:终端环境

      HISTSIZE:历史命令条数

      SSH_CLIENT:当前操作环境是用ssh链接的,这里记录客户端ip

      SSH_TTY:ssh链接的终端时pts/1

      USER:当前登录的用户

      PATH:系统搜索命令的路径

        echo $PATH  #查看PATH环境变量

        PATH=“$PATH”:/root/sh   #增加PATH变量的值

      当前语系变量查询

        locale   #查询当前系统语系

          -LANG:定义系统主语系的变量

          -LC_ALL:定义整体语系的变量

    • 位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的

    $n:n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数需要用大括号包含,如${10}

    $*:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体

    $@:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待

    $#:这个变量代表命令行中所有参数的个数

    • 预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的

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

    $$:当前进程的进程号(PID)

    $!:后台运行的最后一个进程的进程号(PID)

    1.4 接收键盘输入

    • read [选项] [变量名]
      • -p:“提示信息”:在等待read输入时,输出提示信息
      • -t秒数:read命令会一直等待用户输入,使用此选项可以指定等待时间
      • -n 字符数:rea的命令只接受指定的字符数,就会执行
      • -s:隐藏输入的数据,适用于机密信息的输入

    2. Shell运算符

    2.1 declare命令    #声明变量类型

    • declare [+/-] [选项] 变量名
      • -:给变量设定类型属性
      • +:取消变量的类型属性
      • -a:将变量声明为数组型
        • move[0]=cl
        • move[1]=tpc
        • declare -a movie[2]=live
        • echo ${movie}       #列出第一个
        • echo ${movie[2]}   #列出第二个
        • ehco ${movie[*]}   #列出所有
      • -i:将变量声明为整型(integer)
      • -x:将变量声明为环境变量         #与export 作用相似
      • -r:将变量声明为只读变量
      • -p:显示指定变量的被声明的类型

    2.2 数值运算的方法

    • 方法1:aa=123;bb=456 ;declare -i cc=$aa+$bb;
    • 方法2:expr或let数值运算工具
      • dd=$(expr $aa + $bb)   #注意:+号两侧必须有空格
    • 方法3:$((运算式))或者$[运算式]   #常用
      • ff=$($aa+$bb)
      • uu=[$aa+$bb]

    2.3 变量测试    #了解即可

    • 好处:代码精简
    • 坏处:逻辑混乱

    3.环境变量配置文件

      

    4.正则表达式

    sed [选项] '[动作]' 文件名

    选项:

    • -n:一般sed命令会把所有数据都输出到屏幕,如果加入此选择则只会把经过sed命令处理的行输出到屏幕
    • -e:允许对输入数据应用多条sed命令编辑
    • -i:用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出

    动作:

    • -a:追加,在当前行后添加一行或多行
    • -c:行替换,用c后面的字符串替换原数据行  #sed '4c zhehang bujige' student.txt
    • -i:插入,在当前行前插入一行或多行。       #sed '2i piaoliang jiushi renxing ' student.txt
    • -d:删除,删除指定的行                          #sed '2a piaoliang jiushi renxing ' student.txt
    • -p:打印,输出指定的行   
    • -s:子串替换,用一个字符串替换另外一个字符串。格式为“行范围s/旧字串/新子串/g”(和vim中的替换格式类似)        #sed '4s/70/100/g' student.txt           #sed -e 's/a//g;s/c//g' student.txt

    字符处理命令

    • sort 排序命令

    sort [选项] 文件名

    -f:忽略大小写

    -n:以数值型进行排序,默认使用字符串型排序

    -r:反向排序

    -t:指定分隔符,默认是分隔符时制表符

    -k n[,m]:按照指定的字段范围排序。从第n字段开始,m字段结束(默认到行尾)

    • wc统计命令

        wc [选项] 文件名

    -l:只统计行数

    -w:只统计单词数

    -m:只统计字符数

     

    5.流程控制语句

    5.1 条件判断式语句

    按照文件类型进行判断

    -b文件:判断文件是否存在,并且是否为块设备文件(是块设备文件为真)

    -c文件:判断文件是否存在,并且是否为字符设备文件(是字符设备文件为真)

    -d文件:判断文件是否存在,并且是否为目录文件(是目录为真)

    -e文件:判断文件是否存在,(存在为真)

    -f文件:判断文件是否存在,并且是否为普通文件(是普通文件为真)

    -L文件:判断文件是否存在,并且是否为符号链接文件(是符号链接文件为真)

    -p文件:判断文件是否存在,并且是否为惯导文件(是管道文件为真)

    -s文件:判断文件是否存在,并且是否为非空(非空为真)

    -S文件:判断文件是否存在,并且是否为套接字文件(是套接字文件为真)

    按照文件权限判断

    -r文件:判断文件是否存在,并且是否该文件拥有读权限(有读权限为真)

    -w文件:判断文件是否存在,并且是否该文件拥有写权限(有写权限为真)

    -x文件:判断文件是否存在,并且是否该文件拥有执行权限(有执行权限为真)

    -u文件:判断文件是否存在,并且是否该文件拥有SUID权限(有SUID权限为真)

    -g文件:判断文件是否存在,并且是否该文件拥有SGID权限(有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相等(相等为真)         equal

    整数1 -ne 整数2:判断整数1是否和整数2不相等(不相等为真)    not equal

    整数1 -gt 整数2:判断整数1是否大于整数2(大于为真)              greater than

    整数1 -lt 整数2:判断整数1是否小于整数2(小于为真)               less than

    整数1 -ge 整数2:判断整数1是否大于等于整数2(大于等于为真)   greater or equal

    整数1 -le 整数2:判断整数1是否小于等于整数2(小于等于为真)    less or  equal

    字符串的判断

    -z:判断字符串:判断字符串是否为空(为空返回真)

    -n:判断字符串是否为非空(非空返回真)

    字符串1 == 字符串2:判断字符串1是否和字符串2相等(相等返回真)

    字符串1 != 字符串2:判断字符串1是否和字符串2不相等(不相等返回真)

    多重条件判断

    判断1 -a 判断2: 逻辑与,判断1和判断2都成立,最终的结果才为真

    判断1 -o 判断2 :逻辑或,判断1和判断2有一个成立,最终的结果就为真

    !判断:逻辑非,使原始的判断式取反

    5.2 单分支if语句

    if [ 条件判断式 ]; then

      程序

    fi

    或者

    if [ 条件判断式 ] 

      then

      程序

    fi

     5.3 双分支if语句

    if [条件判断式]  

      then

        条件成立时,执行的程序

      else

        条件不成立时,执行的另一个程序

    fi

    #例如               #判断apache服务是否运行

     5.4 多分支条件语句

    if [条件判断式1]  

      then

        条件成立时,执行的程序

    elif [条件判断式2]

      then

        条件不成立时,执行的另一个程序

    ...省略更多条件

    else

        当所有条件都不成立,最后执行此程序

    fi

     5.5 多分支case语句

    case $变量名 in

      "值1")

        如果变量的值等于值1,则执行程序1

        ;;

      "值2")

        如果变量的值等于值2,则执行程序2

        ;;

      ...省略其他分支...

      *)

        如果变量的值都不是以上的值,则执行此程序

    ;;

    esac

    5.6 for循环

    for 变量 in 值1 值2 值3

      do

        程序

      done

    或者

    for (i= 值1;i<=值2;i=epx)

      do

        程序

      done

    5.7 while循环

      while 循环是不定循环,也称作条件循环。只要条件判断式成立,循环就会一直继续,直到条件判断式不成立,循环才会停止。这就和for的固定循环不太一样了。

     

    while [条件判断式] 

      do

        程序

      done

    5.8 until循环

      until循环,和while循环相反,until循环时只要条件判断式不成立则进行循环,并执行循环程序,并执行循环程序。一旦循环条件成立,则终止循环

      

  • 相关阅读:
    Shell 脚本学习 — 简单的执行跟踪
    CentOS — 安装Git客户端
    Linux — cat 命令的使用方法
    关于“分叉/联接方案”的一般做法
    读书笔记 —— 《MySQL技术内幕 InnoDB存储引擎》
    MySQL InnoDB 索引
    CentOS — MySQL备份 Shell 脚本
    CI system/libraries/Session.php
    WinForm 处理未处理的异常 Application.ThreadException + AppDomain.CurrentDomain.UnhandledException
    重构案例1 — ECShop (lib_common.php build_url 函数)
  • 原文地址:https://www.cnblogs.com/wangshujing/p/shell.html
Copyright © 2011-2022 走看看