美文网首页
shell 基础

shell 基础

作者: 清风徐来_简 | 来源:发表于2020-01-15 16:48 被阅读0次
  • 1,蛇帮,两种写法都可以。

    #! /bin/sh
    #! /bin/bash

  • 2,执行,两种方法。
    • /bin/sh test.sh (用解释器执行文件,写了蛇帮也没用)
    • chmod +x test.sh:先设定可执行权限
         ./test.sh :(可执行程序执行)再执行
  • 3,定义变量

    变量名和等号之间不能有空格
    变量名只能使用英文字母,数字,下划线,不能以数字开头
    中间不能有空格,可以使用下划线(_)
    不能使用标点符号
    不能使用bash中的关键字

  • 4,使用变量,两种方式(echo 相当于 print)
    name='zhangsan'
    echo $name
    echo ${name} --> 为了区分边界,推荐使用这种
    
  • 5,只读变量
    name='aaa'
    readonly name --> 设置只读属性
    name='bbb'    --> 再次赋值就会报错:This variable is read  only.
    
  • 6,还可删除变量
    unset 变量名  --> 不能删除只读变量
    name='aaa'
    unset name
    echo ${name}  --> 被删除后,不在输出
    
  • 7,获取字符串长度
    echo ${#name} --> 输出字符串长度
    
  • 8,字符串切片
    str='my name is aaa'
    str2=${str:1:4}
    echo ${str2}  --> m na,提取索引1和索引4位置中间字符
    
  • 9,查找字符索引位置(第一个出现的字符)(内含反引号)
    echo `expr index "$str" ib` --> 查找i或者b的索引位置,写一个就查一个
    
  • 10,数组
    定义数组:
          arr=(1 3 5 7 9) --> 一次性赋值,没有逗号,一定不要加逗号,加上逗号会成为1个元素
          arr1[0]=1 --> 一个个赋值,不用提前设定变量
          arr1[1]=2
          arr1[2]=3
          
    获取数组数据:
          ${arr[index]} --> 获取单个元素
          ${arr[@]} --> 获取所有元素
    
  • 11,获取数组长度
    echo ${#arr[@]}
    echo ${#arr[*]}
      
    获取单个元素长度
        echo ${#arr[5]}
    
  • 12,注释
    单行注释:#
    多行注释:
        :<<!
        注释内容...
        注释内容...
        注释内容...
        !
        (!可换成其他符号)
    
  • 13,传参
    $0 命令的第一个参数 --> 文件名
    $1 命令的第二个参数 --> 除文件名以外的第一个参数
    ......以此类推
      
    $# 除文件名以外的参数个数
    $* 将参数组合成一个参数,以字符串形式显示
    $@ 将所有参数,单独分开显示
    
  • 14,if逻辑语句,如果else中不做任何动作,就不能有else
    if [ 条件 ]; then
        执行
    elif [ 条件2 ]; then
        执行
    else
        执行
    fi
    
  • 15,循环语句
    for循环:
        for i in x; do
          执行
        done
      
    while循环:
        int=1
        while (( $int<=5 ))
        do
            echo $int
            let "int++"
        done
              
    until循环:
        until [ ! $a -lt 10 ]
        do
            echo $a
            a=`expr $a +1`
        done
          
    case情况:
        read num
        case $num in
        1) echo 你输入了1
        ;;
        2) echo 你输入了2
        ;;
        *) echo 你输入的不是1或2
        ;;
        esac
          
    跳出循环(break):
        while :
        do
            echo -n 输入1到3之间的的数字:
                read num
            case $num in
                1|2|3|) echo 你输入了 $num
                ;;
                *) echo 你输入超出了范围,输入结束
                 break
                ;;
            esac
        done
          
    跳出本次循环,执行下次(continue):
        while :
        do
            echo -n 输入数字:
            read num
            case $num in
                4) continue
                ;;
                *) echo 你输入了 $num
                ;;
            esac
        done      
    
  • 16,基本运算符

    原生bash不支持简单的数学运算,但可以通过其他命令实现,比如 awk、expr,expr最常用
    表达式中的运算符两边必须有空格,比如:2 + 2
    完整的表达式要被``反引号,包含 ⬇

    算数运算符:
        +   -    *   /   %     =     ==    !=
        加  减  乘  除  取余  赋值  相等  不等
        `expr 2 + 2`  --> 4
        `expr 2 \* 2` --> 4 乘法需要加上反斜杠
          
        echo $[2+2] --> 4
          
    关系运算符:
        -eq --> 判断是否相等
        -ne --> 判断是否不等
        -gt --> 判断是否大于
        -lt --> 判断是否小于
        -ge --> 判断是否大于等于
        -le --> 判断是否小于等于
      
    布尔运算符:(非与或)
        !  非运算,取反的意思
        -o 或运算,等同于 &&
        -a 与运算,等同于 ||
          
    字符串运算符:
        =   --> 是否相等,返回布尔值
        !=  --> 是否不等,返回布尔值
        -z  --> 字符串长度是否为0,为0返回true
        -n  --> 字符串长度是否为0,不为0返回true
        $   --> 字符串是否为空,不为空返回true
        例:if [ -z'' ];then echo "字符串为空"; fi
          
    文件测试运算符(注意格式,中间有空格):
        -b file 检测文件是否是块设备文件,是返回true
        -c file 检测文件是否是字符设备文件,是返回true
        -d file 检测文件是否是目录,是返回true
        -f file 检测文件是否是普通文件,是返回true
        -r file 检测文件是否可读,是返回true
        -w file 检测文件是否可写,是返回true
        -x file 检测文件是否可执行,是返回true
        -s file 检测文件是否为空难(文件大小是否为0),不为空返回true
        -e file 检测文件/目录是否存在,存在返回true
        例:if [ -d $file ]; then     echo "是目录"; else     echo "不是目录"; fi
    
  • 17,read,显示变量,相当于input
    #! /bin/sh
    read name
    echo "我叫 $name"
      
    ./test.sh 执行,会等待输入,输入aaa,显示结果,我叫aaa
    
  • 18,显示不换行,-c不换行
    echo -e 'nihao \c';echo 'haha'
    
  • 19,显示结果定向至文件,>定向符
    echo "你好" > test
    
  • 20,原字符串输出,不转译,用单引号''
    name=aaa
    echo $name   --> aaa
    echo "$name" --> aaa
    echo '$name' --> $name
    
  • 21,显示命令执行结果,反引号
    echo `date`  
    
  • 22,test 检查某个条件是否成立,可对数值、字符、文件三方面进行检查
    数值: if test $[num1] -eq $[num2]; then     echo '两个数相等!'; else     echo '两个数不相等!'; fi
    字符: if test $num1 = $num2; then     echo '两个字符串相等!'; else     echo '两个字符串不相等!'; fi
    文件: if test -e ./bash; then     echo '文件已存在!'; else     echo '文件不存在!'; fi
    
    感觉 if case test 语句都差不多。都可以代替使用。
    
  • 23,函数
    【定义函数】
      demoFun(){
          echo "这是我的第一个 shell 函数!"
      }
      echo "-----函数开始执行-----"
      demoFun  --> 【执行函数,不加括号】
      echo "-----函数执行完毕-----"
    
  • 24,函数返回值,以及获取返回值
    funWithReturn(){
        echo "输入第一个数字: "
        read aNum
        echo "输入第二个数字: "
        read anotherNum
        return $(($aNum+$anotherNum))
        }
        funWithReturn
        echo "输入的两个数字之和为 $? !"
       【$? 获取函数执行的返回值】
    
  • 25,函数参数
    funWithParam(){
          echo "第一个参数为 $1 !"
          echo "第二个参数为 $2 !"
          echo "第十个参数为 ${10} !"  --> 当n>=10时,需要使用${n}来获取参数
          echo "第十一个参数为 ${11} !"
          echo "参数总数有 $# 个!"
          echo "作为一个字符串输出所有参数 $* !"
          }
    funWithParam 1 2 3 4 5 6 7 8 9 34 73
    
  • 26,输出重定向
    ifconfig > test.log  --> 将内容输出到文件(文件不存在会创建,存在会覆盖)
    ls >>test.log        --> 将内容追加至文件,不是覆盖(只写入正确命令)
    aaa 2>>test.log      --> 将错误的信息记录下来(只记录错误命令,正确的会执行,不写入)
                             错误输出时,符号左右两边没有空格,正确输出时无所谓)
    命令 > 文件 2&1      --> 以覆盖的方式,把正确输出和错误输出都保存到同一个文件中
    命令 &>文件          --> 以覆盖的方式,把正确输出和错误输出都保存到同一个文件中
    命令 >> 文件 2>&1    --> 以追加的方式,把正确输出和错误输出都保存到同一个文件中
    命令 &>>文件         --> 以追加的方式,把正确输出和错误输出都保存到同一个文件中
    命令>>文件1 2>>文件2 --> 把正确输出追加到文件1,错误输出追加到文件2
      
    command > /dev/null:将命令结果放进黑洞,不显示,也不写入文件
    
  • 27,文件包含(文件导入)
    test1.sh
        #!/bin/bash
        echo 我是test1
          
    test2.sh
        #!/bin/bash
        source ./test1.sh  --> 导入,或者使用【. ./test1.sh】,点后有一个空格。
          
    ./test2.sh 执行,得出结果:我是test1
    
  • 28,其他
    echo 引号可加可不加
      
    \  反斜杠代表转译    
      
    shell 语言中 0 代表 true,0 以外的值代表 false。   
    

相关文章

网友评论

      本文标题:shell 基础

      本文链接:https://www.haomeiwen.com/subject/tcwtzctx.html