Linux回顾(第六天)

变量赋值

  • 变量的定义

    • 字母,数字,下划线
    • 不以数字开头
  • 变量的赋值-变量替换

    • shell的脚本不区分类型
    • 变量名=变量值
      • a=133
    • 使用let为变量赋值
      • let a=10+20
    • 将命令赋值给变量
      • l=ls
    • 将命令结果赋值给变量,使用$()或者``
      • letc=$(ls -l /etc)
    • 变量值有空格等特殊字符可以包含在””或’’中
  • 变量的引用

    • ${变量名}称作对变量的引用
    • echo ${变量名} 查看变量的值
    • ${变量名} 在部分情况下可以省略为 $变量名
  • 变量的作用范围

    • 默认只在当前的shell,其子进程和父进程和平行的进程都不会生效
    • 脚本中的变量默认在当前的bash也不会生效
    • 如果想让脚本的变量也可以使用其他的进程使用使用. 和source的方式
    • 还可以通过export来导出变量,使得子进程可以访问父进程的变量
    • 删除变量:unset 变量名
  • 系统环境变量

    • 环境配置:每个Shell打开都可以获得到的变量

      • set和env命令
        • 可以查看默认的环境变量
        • set可以查看更多变量
      • $? $$ $0 //预定义变量
        • $? :可以用来确认上一次命令是否执行成功,返回为0即为成功
        • $$:显示当前进程的PID
        • $0:显示当前进程的名称
      • $PATH
        • 使用echo $PATH来来看当前命令的搜索路径
        • PATH=$PATH:/root //添加了/root为搜索路径
        • 环境变量只对当前的shell的任意位置生效,子进程也可以生效
        • 而当我们使用新的终端,则不会生效
      • $PS1
        • 可以使得终端显示个性化信息
    • 位置变量

      • $1 $2 $n

      • #!/bin/bash
        # $1 $2...${10}
        pos1=$1
        pos2=$2
        
        echo pos1
        echo pos3
        
        1
        2
        3
        4
        5
        6
        7
        8

        - 当我们在执行脚本传递参数的时候,会传递到$n这个变量中

        - ```shell
        #!/bin/bash
        # $1 $2...${10}
        echo $1
        echo $2
      • 事实上上面的两段代码的作用效果时相同的,如果我们给上面的脚本加上两个参数,便会显示这两个参数

      • 当我们读入的参数如果时空值可能会出现一些错误,我们可以用下面的写法

      • #!/bin/bash
        echo $1
        echo ${2}_
        
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
          
        - 代表如果$2时空值读入_

        - 这样的小技巧 显然又会带来另外的一个问题:如果我们的参数不是空值不久多出来了_吗因此我们可以来使用下下面的写法

        - ```shell
        #!/bin/bash
        pos1=$1
        pos2=${2-_}

        echo $pos1
        echo $pos2
        这样在有参数的时候会去掉 _而没有参数的时候则会为 _
  • 环境变量配置文件

    • /etc/profile //所有用户的通用配置文件
    • /etc/profile.d/
    • ~/.bash_profile //用户特有
    • ~/.bashrc //用户特有
    • /etc/bashrc //所有的用户通用的配置文件
      • 当我们使用su - root四个脚本都会被执行
      • 如果只使用su root则只会执行.bashrc和/etc/bashrc
    • 如果我们想要添加环境变量,在以上的四个文件均可
      • export PATH=$PATH:new/path
      • 为了保证子进程可以访问到环境变量我们需要在前面加上export
      • 当我们将新的环境变量写入到配置文件中并不会立即的生效
      • 可以通过exit来重新打开bash也可以使用source /etc/bashrc

数组

  • 定义数组

    • IPTS=( 192.168.1 192.168.2 192.168.3)
  • 显示数组中的所有元素

    • echo ${IPTS[@]}
  • 显示数组元素的个数

    • echo ${#IPTS[@]}
  • 显示数组的第一个元素

    • echo ${IPTS[0]}

转义与引用

  • 特殊字符:一个字符不仅有字面意义,还有元意

    注释

    • ;分号
      • 连接两个命令,或者两个脚本

    转义

    • \转义符号
      • \n \r \t 单个字母的转义
      • \ $ \ " \\ \ 单个非字母的转义
  • 引用

    • “”和’’

    • 使用单引号 就会原样输出

    • 而如果我们使用双引号就可以对变量进行解释

运算符

  • 赋值运算符

    • = 可以用于算数赋值和字符串赋值
    • 使用unset取消为变量的赋值
    • =除了作为赋值运算符还可以作为测试操作符
  • 算数运算符

    • 基本运算符

      + - * / ** %

    • 使用expr进行运算

      expr 4+5

  • 数字常量

    • let “变量名=变量值”
    • 变量值使用0开头为八进制
    • 变量值使用0x开头为十六进制
  • 双圆常量

    • 双圆括号时let命令的简化
      • (( a = 10 ))
      • (( a++ ))
      • echo $((10 + 20))
      • num1 = expr 4+ 5

特殊符号大全

  • 引号

    • ’完全引用
    • “不完全引用:会对变量进行解释
    • ·执行命令
  • 括号

    • () (()) $()圆括号
      • 单独使用圆括号 会产生一个子shell (xyz=123)
      • 数组的初始化ips=(ip1 ip2 ip3)
      • 两个圆括号是可以进行一个运算
      • 还可以使用$(命令) ,可以将命令的结果赋值给变量
    • [] [[]]方括号
      • 单独使用方括号是测试(test)或数组元素功能
        • [ 5 -gt 4 ] 用来比较大小如果大于 则返回0的值,可以使用echo $?来进行查看
      • 两个方括号表示测试表达式
        • [[ 5 > 4 ]]两个方括号可以直接使用< >
    • <>尖括号 重定向符号
      • ls > a.txt
      • 2> 可以记录一些错误的信息
    • {}花括号
      • 输出范围 echo{0..9}
      • 文件复制cp /etc/passwd{,.bak} = cp -v /etc/passwd /etc/passwd.bak
  • 运算和逻辑符号

    • + - * / % 算术运算符
    • > < = 比较运算符
    • && || !逻辑运算符号
  • 转义符号

  • 其他符号

    • #注释符号
    • ;命令分隔符
      • case语句的分隔符需要转义;;
    • :空指令
    • .和source命令相同
    • ~家目录
    • ,分隔符
    • *通配符
    • ?条件测试 或 通配符
    • $取值符号
    • |管道符号
    • &后台运行符号
    • _空格

test比较(测试与判断)

  • 退出与退出状态

    • 测试与判断
      • exit
      • exit 10返回10给shell,返回非0位不正常退出
      • $?判断当前的shell前一个进程是否正常退出
  • 测试命令 test

    • 文件测试
    • 整数比较测试
    • [ 5 -gt 7 ]
    • 字符串测试
      • [ “abc” = “abc” ]
      • 字符串的比较是区分大小写的
  • test可以简化为[]符号

  • [[]]此类方法位扩展写法支持&& || < >

  • 使用if-then语句

    • if-then语句的基本用法
      • if [ 测试条件成立 ] 或者命令返回值是否为0
      • then 执行相应的命令
      • fi 结束
      • 例如我们可以使用if [ $UID = 0 ]或[ $USER = root ]来判断当前用户是否是root
  • 使用if-then-else语句

    • if [ 测试条件成立 ]

    • then 执行相应命令

    • else 测试条件不成立,执行相应命令

    • fi 结束

    • #!/bin/bash
      if [ $USER = root ] ;then
          echo " user root "
      else
          echo " other user "
      fi
      
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10

      我们还有另外的一种使用方法

      ```shell
      if [ 测试条件成立 ]
      then 执行相应命令
      elif [ 测试条件成立 ]
      then 执行相应命令
      else 测试条件不成立,执行相应命令
      fi 结束
      下面是一些举例
      1
      2
      3
      4
      5
      6
      7
      8
      9
      #!/bin/bash
      #root geek other
      if [ $USER = root ] ; then
      echo "root"
      elif [ $USER = geek ] ; then
      echo "geek"
      else
      echo "other user"
      fi
  • 嵌套if的使用

  • 适用于判断两个条件

  • #if 条件测试中可以再    嵌套if条件测试
    if [ 测试条件成立 ]
    then 执行相应命令
        if [ 测试条件成立 ]
        then 执行相应的命令
        fi 结束
    fi 结束
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
      
    - 下面进行一个简单的举列

    - ```shell
    #!/bin/bash

    #demo if then if then fi fi
    if [ $UID = 0 ] ; then
    echo "please run"
    if [ -x /tmp/10.sh ] ; then
    /tmp/10.sh
    fi
    else
    echo "switch user root"
    fi
你的支持是我最大的动力!
0%