shell笔记

Shell笔记

  • 查看默认shell类型:ehco $SHELL
  • 查看支持的shell类型:cat /etc/shells

一、使用方式

  • 命令直接输入并执行

    echo hello
    
  • 通过编辑脚本

    # 新建脚本test.sh (写脚本的时候最好添加 #!/bin/bash  指定编译脚本的编译器)
    #!/bin/bash
    echo hello 
    echo hello2
    

二、运行方式

  • sh运行:sh t.sh
  • bash运行: bash t.sh
  • 绝对路径运行:/root/t.sh-
  • 相对路径运行: ./t.sh
  • source指令执行:```source t.sh``

三、脚本规范

  • 文件命名

    • 不要使用数字开头
    • 不使用shell关键字作为文件名
    • 文件后缀为.sh
  • 文件内容

    • 首行:#!/bin/bash

    • 等号前后不含空格

    • []内容前后留空格* 如 [ name ]

    • 变量引用使用双引号和大括号:“{name}”

  • 注释

    • 单行注释: # 作为单行注释

    • 多行注释:

      # :<<加指定注释符开头,以开头指定的注释符为结尾,中间区域为注释区
      :<<!
      	注释内容
      	注释内容
      !
      
      :<<K
      	注释内容
      	注释内容
      K
      

四、shell本地变量

  • 变量规范

    • 不能以数字开头
    • 区分大小写
    • 变量名和等号直接不要有空格
    • 使用$加变量名使用变量的值
  • 变量查看方式

    • echo $变量名
    • echo “$变量名”
    • echo ${变量名}
    • echo “${变量名}”
  • 取消变量

    • unset 变量名:unset name
  • 本地变量

    • 普通变量

      • 变量名=变量值 :中间不能含有空格

        name=Li  # 正确
        name = Li #错误
        name=L i  #错误
        

        在这里插入图片描述

      • 变量名=‘变量值’ :单引号里面必须全部为字符串

        name='Li'  # 单引号会把内容当做字符串处理,不会解析其中的变量
        name2='$name U'
        

        在这里插入图片描述

      • 变量名=“变量值”:双引号如果有其他变量,则会解析变量

        name2="$name U" # name会解析为它的值
        

        在这里插入图片描述

    • 命令变量
      用户自定义的变量,变量值为shell命令执行的结果

      • 变量名=命令

        list=`ls`
        echo $list
        
      • 变量名=$(命令)

        list=$(ls)
        echo $list
        
  • read 读取外部变量

    read -p "提示信息" 变量名
    如:read -p "请输入目录" targetdir
    
    #!/bin/bash
    read -p "请输入目录" targetdir
    ls ${targetdir}
    

五、全局变量

  • export: 设置全局变量 export NAME=Li

  • unset:取消全局变量 unset NAME

    脚本文件去获取命令行中声明的变量

    在这里插入图片描述

六、内置变量

  • 特殊的变量

    序号变量含义
    1$0脚本名
    2$1-$9参数位置1-9
    3$#参数的个数
    4$*所有参数
    #! /bin/bash
    echo "第一个参数:${1}"
    echo "第三个参数:${3}"
    echo "文件名:$0"
    echo "所有参数:$*"
    echo "参数个数$#"
    

    在这里插入图片描述

  • 输出当前的所在目录

    #! /bin/bash
    result=`pwd`
    echo "当前目录:${result}"
    
  • 输出统计文件个数

    #! /bin/bash
    #内置变量实现
    count=`ls $1 | wc -l`
    echo "$1下的子级个数:${count}"
    
    #读取键盘录入
    read -p "请您输入一个目录:" mydir
    count=`ls ${mydir} | wc -l`
    echo "${mydir}目录下子级个数是:${count}"
    

七、运算符

  • 算数运算符: 格式:$((数学表达式)) 符号:+ - * /

    在这里插入图片描述

  • 比较运算符:语法:[ 表达式 ]

    序号符号说明
    1-eq [equal]等于
    2-ne [no equal]不等于
    3-gt [greate then]大于
    4-ge [greate equal]大于等于
    5-lt [less than]小于
    6-le [less equal]小于等于

    在这里插入图片描述

    $?:最后运行的命令的结束代码(返回值)即执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误) ,0也可以理解为true

  • 逻辑运算符

    序号表达说明
    1-a [and]
    2-o [or]
    3!

    在这里插入图片描述

  • 字符串比较

    序号表达说明
    1==判断字符串内容是不是一样
    2!=判断2个字符串内容是不是一样
    3-z判断字符串是不是空串

    在这里插入图片描述

  • 文件判断

    序号参数 格式说明
    1-e filename文件是否存在,存在为真,不存在为假
    2-d filename判断是否存在且为目录
    3-f filename判断是否为普通文件

    在这里插入图片描述

  • 例子

    • 判断是文件夹是否为空

      #! /bin/bash
      # 通过内置变量
      count=`ls $1 | wc -l`
      [ ${count} -eq 0 ]
      echo "目录为空吗:$?"
      
      #读取键盘录入的目录
      read -p "请您输入一个目录:" mydir
      count=`ls ${mydir} | wc -l`
      [ ${count} -eq 0 ]
      echo "目录为空吗:$?"
      

八、数组

  • 数组定义:数组名=(值1 值2 ...)

  • 查询数组

    • 查询指定:${数组名[索引]}
    • 查询全部:${数组名[* | @]}
    • 查看长度:${#数组名[*|@]}
  • 修改数组:数组名[索引]=新值

  • 删除数组: unset 数组名

    在这里插入图片描述

九、函数

1、简单函数
1.定义函数:
    function 函数名(){
        语句
        ...
    }
2.调用函数:
    函数名
#!/bin/bash
fun01(){
echo "简单函数"
}

fun01
2、带参函数
  • 调用函数时,带参数

    #!/bin/bash
    fun01(){
    echo "带参函数: $1"
    }
    
    # 调用函数时,传入参数
    fun01 "参数1"
    
  • 执行脚本时,传入参数

    #!/bin/bash
    fun01(){
    echo "带参函数: $1 $2"
    }
    
    fun01 $1 $2
    
    
  • 例子

    #!/bin/bash
    read -p "请输入第一个数:" num1
    read -p "请输入第二个数:" num2
    
    # 声明函数
    sum(){
        num=$((num1+num2))
        echo "两个数的和为:$num"
    } 
    
    # 调用函数
    sum
    
    #! /bin/bash
    read -p "请您输入长方形的长:" long
    read -p "请您输入长方形的宽:" width
    #编写周长
    getPerimeter(){
       length=$(((long + width) * 2 ))
    }
    
    getArea(){
       area=$((long * width ))
    }
    
    #调用函数
    getPerimeter
    getArea
    echo "长方形的周长是:${length}"
    echo "长方形的面积是:${area}"
    

十、if语句

  • 格式1

    说明:如果条件成立,则执行then后面语句,否则执行else后面语句
    格式:
        if [ 条件 ]
        then
            语句块
    
        else
            语句块 
        fi
    
  • 格式2

    格式:
        if [ 条件 ]
        then
            语句块
    
        elif [ 条件 ]
        then    
            语句块
    
        elif [ 条件 ]
        then
            语句块 
            ......
        else
           语句块
        fi
    
  • 单分支

    #! /bin/bash
    read -p "请输入用户名" username
    read -p "请输入密码" password
    if [ $username == "admin" -a $password == "123456" ]
    then
    echo "登录成功"
    else
    echo "账号或密码有误"
    fi
    
  • 判空输入

    #! /bin/bash
    read -p "请输入一个值" value
    if [ -z $value ]
    then
    echo "您输入的数据是空的"
    elif [ -d $value ]
    then
    echo "您输入的数据是目录"
    elif [ -f $value ]
    then
    echo "您输入的数据是一般文件"
    else
    echo "数据有误"
    fi
    

十一、case语句

  • 格式

    条件符合执行相应的代码块,类似于if..elif..语句
    格式:
        case 变量 in
            值1 )
                echo "语句块1"
                ;;
            值2 )
                echo "语句块2"
                ;;
            值3 )
                echo "语句块3"
                ;;
            ...
            * )
                echo "语句块4-默认值"
                ;;
            esac
    提示:
        1. 星号(*)相当于else,条件都不符合时执行;
        2. 双分号(;;)是必须的,执行完相应语句块跳出程序;
    
  • 例子

    #! /bin/bash
    read -p "请输入一个数字" num
    case $num in
    1)
    echo "简单";;
    2)
    echo "一般";;
    3)
    echo "困难";;
    *)
    echo "数据有误";;
    esac
    
  • 取值范围为列表

    #! /bin/bash
    read -p "请输入一个商品代号" myscore
    case $myscore in
    [0-3])
    echo "不满意";;
    [4-6])
    echo "满意";;
    [7-9])
    echo "非常满意";;
    *)
    echo "数据有误";;
    esac
    

十二、for循环

  • 格式

    遍历读取列表元素,列表元素遍历完毕,结束语句;
    
    语法格式:
    forin 列表
    do
        执行语句
    done
    
  • 1-100整数和

    #! /bin/bash
    sum=0
    for ele in `seq 100`
    do
    sum=$(($sum+$ele))
    done
    echo "1-100之间的和为:${sum}"
    

    注意:

    • 遍历一组数据时,这组数据的实现方案:
    • 格式1: 参数1 参数2 参数3 …
    • 格式2: seq 命令
    • seq N == 获取 [1-N] 之间的所有整数
    • seq N1 N2 == 获取 [N1-N2]之间的所有整数
    • seq N1 N2 N3 == 获取[N1-N3] 之间的正式,每次获取时都在上一个数字的基础之上 +N2(默认 +1)

十三、while循环

  • 格式

    说明:只要条件满足,就一直循环
    while [ 条件 ]
    do
        执行语句
    done
    
    提示:
        1. 条件的类型:命令、字符串表达式、数字表达式
        2. 中括号内前后有空格
    
  • 求1-100的整数和

    #! /bin/bash
    sum=0
    num=1
    while [ $num -le 100 ]
    do
    sum=$(($sum + $num))
    num=$(($num + 1))
    done
    echo "sum=${sum}"
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值