一文带你学会Shell基操

目录

初识shell

第一个脚本文件

注释

变量

数组

算术运算符

test命令(Shell [])及Shell [[]]

字符串运算符

关系运算符

布尔运算符

逻辑运算符

判断语句

选择语句

循环语句

函数


初识shell

  • 在计算机科学中,shell就是一个命令解释器
  • shell是位于操作系统和应用程序之间,是它们二者最主要的接口
  • shell负责把应用程序的输入命令信息解释给操作系统,将操作系统指令处理后的结果解释给应用程序
  • 一句话:
  • shell就是在操作系统和应用程序之间的一个命令翻译工具
  • Windows和Linux中的shell
  • Windows:
  • cmd.exe 命令提示字符
  • Linux:
  • sh/csh/ksh/bash/...
  • 默认使用bash
  • 使用方式
  • 手工方式
  • 直接输入命令,按Enter后执行命令
  • 逐行输入命令,逐行进行确认执行
  • 脚本方式
  • 把手工执行的命令,写到一个文件中,然后运行这个文件,达到执行命令的效果
  • 这个文件就叫脚本文件
  • 第一个脚本文件

  • 新建一个文件后缀名为sh
  • 书写内容
  • 第一行 #!/bin/bash 声明这个 脚本 使用的shell版本:
  • 因为shell有很多种类型 比如sh,bash,csh,tcsh
  • 如果不指定版本 系统会不知道用哪一个版本的shell去处理这个脚本所以会报错
  • 一般linux发行版默认内置的是bash
  • 所以一般是写#!/bin/bash
  • 运行程序
  • bash 文件名.sh
  • 注释

  • 单行注释
  • 就是前面加了个#
  • # 注释的内容
  • 多行注释
  • 第一种(习惯)
  • :<<!
     注释的内容
    !

    第二种

  • :<<字符
     注释的内容
    字符

  • 变量

  • 定义变量
  • 普通变量
  • 方式一
  • 变量名=变量值
  • 变量值必须是一个整体,中间没有特殊字符
  • 例:
  • number=10
  • echo $number(前面加$表示使用变量,否则会当普通字符处理)
  • 方式二
  • 变量名='变量值'
  • 只会原样赋值
  • 例:
  • number=10
    a='$number'
    echo $a

    输出$number;而不是10

  • 方式三
  • 变量名="变量值"
  • 如果双引号里面有其它变量,会把变量的结果进行拼接,然后赋值
  • 例:
  • number=10
    a="$number"
    echo $a

    输出10

  • 习惯:
  • 数字不加引号,其它默认加双引号
  • 命令变量
  • 方式一
  • 变量名=`命令`
  • 方式二
  • 变量名=$(命令)
  • 效果一样,但第二种可读性更高
  • 都是将命令的运行结果赋值给变量
  • 例:
  • c=`date`
    echo $c
    d=$(date)
    echo $d

  • 使用变量
  • 方式一
  • $变量名 非标准写法,图省事
  • 方式二
  • "$变量名" 非标准写法,图省事
  • 方式三
  • ${变量名} 在双引号里面要使用变量的值
  • 方式四
  • "${变量名}" 标准使用方式
  • 例:
  • d=$(date)
    result="现在的时间为${d}"
    echo "${result}"

    只读变量

  • readonly 变量名
  • 只读不能再赋值
  • 删除变量
  • unset 变量名
  • 数组

  • 定义数组
  • 数组名=(值1 值2 值3....值n)
  • 例:
  • arr=(1 2 3 4 5)
  • 给数组的元素赋值
  • 数组名[索引]=值
  • 例:
  • arr[0]=1
  • 获取元素
  • ${数组名[下标]}
  • 例:
  • ${arr[0]}
  • 使用@或*可以获取数组中的所有元素
  • 例:
  • ${arr[*]}
  • ${arr[@]}
  • 拼接数组
  • 先利用@或*,将数组扩展成列表,然后再合并到一起
  • array_new=(${array1[@]} ${array2[@]})或array_new=(${array1[*]} ${array2[*]})
  • 例:
  • array1=(23 56)
    array2=(99 "http://c.biancheng.net/shell/")
    array_new=(${array1[@]} ${array2[*]})
    echo ${array_new[@]}  #也可以写作 ${array_new[*]}

  • 删除数组元素
  • 使用 unset 关键字来删除数组元素
  • unset array_name[index]
  • 删除整个数组
  • unset array_name
  • 获取长度
  • ${#数组名[*]}
  • ${#数组名[@]}
  • 例:
  • echo "数组的长度${#arr[*]}"
    echo "数组的长度${#arr[@]}"

    算术运算符

  • 1.原生的bash不支持简单的数学运算
  • 可以通过其它命令实现
  • 用于整数运算,效率很高
  • (( ))
  • 可用于整数运算,也可以处理字符串
  • expr
  • Linux下的一个计算器程序,可以处理整数和小数。Shell 本身只支持整数运算,想计算小数就得使用 bc 这个外部的计算器
  • bc
  • 2.表示式和运算符之间要有空格
  • 3.完整的表达式要被反引号包含
  • 例:
  • `expr 2 + 2`
    #整数相加
    num1=`expr 2 + 2`
    num1=$(( 2 + 2 ))
    echo "整数2+2的结果为$num1"
    #整数相减
    num2=`expr 2 - 2`
    num2=$(( 2 - 2 ))
    echo "整数2-2的结果为$num2"
    #整数相乘
    num3=`expr 2 \* 2`(斜杠表转义)
    num3=$(( 2 * 2 ))
    echo "整数2*2的结果为$num3"
    #变量相加
    a=10
    b=20
    num4=`expr $a + $b`
    echo "变量a和变量b相加的结果为$num4"
    #赋值
    c=30
    num5="${c}"
    echo "变量c的值赋值给num5,打印num5的值$num5"
    #自增
    e=1
    ((e++))
    echo "变量e为1,自增之后,结果为$e"

    test命令(Shell [])及Shell [[]]

  • test 是 Shell 内置命令,用来检测某个条件是否成立
  • test 通常和 if 语句一起使用,并且大部分 if 语句都依赖test
  • 用法
  • test expression
  • 当 test 判断 expression 成立时,退出状态为 0,否则为非 0 值
  • test 命令也可以简写为[]
  • [ expression ]
  • 注意[]和expression之间的空格,这两个空格是必须的,否则会导致语法错误
  • []的写法更加简洁,比 test 使用频率高
  • [[ ]]是 Shell 内置关键字,它和 test 命令类似,也用来检测某个条件是否成立
  • 可以认为 [[ ]] 是 test 的升级版,对细节进行了优化,并且扩展了一些功能
  • 用法
  • [[ expression ]]
  • 当 [[ ]] 判断 expression 成立时,退出状态为 0,否则为非 0 值
  • 注意[[ ]]和expression之间的空格,这两个空格是必须的,否则会导致语法错误
  • 字符串运算符

  • 在以下:真返回0,假返回1
  • 检测两个字符串是否相等,相等返回true
  • =
  • 例:
  • a="aaa"
    b="bbb"
    [ "${a}" = "${b}" ]

    检测两个字符串是否不相等,不相等返回true

  • !=
  • 例:
  • [ "${a}" != "${b}" ]

    检测字符串长度是否为0,为0返回true

  • -z
  • 例:
  • [ -z "${a}" ]

    检测字符串长度是否不为0,不为0返回true

  • -n
  • 例:
  • [ -n "${a}" ]

    检测字符串是否为空,不为空返回true

  • $
  • 例:
  • [ $a ]
    [ $"{$a}" ]

    配合上面任何语句使用

  • 获取上一条语句的执行结果
  • $?
  • 获取字符串长度
  • echo "字符串长度为 ${#a}"

    关系运算符

  • 还是0为真,1为假
  • 检测两个数是否相等,相等返回true
  • -eq(equals)
  • 例:
  • [ "${a}" -eq "${b}" ]

    检测两个数是否不相等,不相等返回true

  • -ne(not equals)
  • 例:
  • [ "${a}" -ne "${b}" ]

    检测左边的数是否大于右边的,如果是,则返回true

  • -gt(greater than)
  • 例:
  • [ "${a}" -gt "${b}" ]

    检测左边的数是否小于右边的,如果是,则返回true

  • -lt(less than)
  • 例:
  • [ "${a}" -lt "${b}" ]

    检测左边的数是否大于等于右边的,如果是,则返回true

  • -ge(greater equals)
  • 例:
  • [ "${a}" -ge "${b}" ]

    检测左边的数是否小于等于右边的,如果是,则返回true

  • -le(less equals)
  • 例:
  • [ "${a}" -le "${b}" ]

  • 布尔运算符

  • 0是真,1是假
  • 取反运算
  • !
  • [ ! false ]返回true
  • a=10
    [ ! "${a}" -eq 10 ]
    echo "$?"

输出1

  • 或运算,有一个表达式为true则返回true
  • -o(or)
  • 例:
  • a=10
    b=20
    [ "${a}" -lt 20 -o "${b}" -gt 100 ]

    理解:(a<20||b>100)

  • 输出0
  • 与运算,两个表达式都为true才返回true
  • -a(and)
  • 例:
  • a=10
    b=20
    [ "${a}" -lt 20 -a "${b}" -gt 100 ]

    理解:(a<20&&b>100)

  • 输出1
  • 逻辑运算符

  • 0就是真,1就是假
  • 必须写在双括号中
  • 逻辑的and
  • &&
  • 例:
  • a=10
    b=20
    [[ "${a}" -lt 100 && "${b}" -gt 100 ]]
    echo $?

    输出1

  • 逻辑的or
  • ||
  • 例:
  • a=10
    b=20
    [[ "${a}" -lt 100 || "${b}" -gt 100 ]]
    echo $?

    输出0

  • 判断语句

  • 第1种
  • 满足if中的条件就执行then里的语句体,不满足条件就不执行then里的语句体
  • fi表判断语句的结束标记
  • 第2种
  • 满足if中的条件就执行then里的语句体,不满足条件就执行else里的语句体
  • 第3种
  • elif后也要跟一个then
  • 满足if中的条件就执行then里的语句体,不满足条件就看看下一个elif是否满足条件,满足则执行,后面的就不再判定了,要是所有if和elif条件都不满足,则执行else里的语句体
  • 例:
  • #查找一个进程 ,如果这个进程存在,就打印true
    if [ $(ps -ef | grep -c "ssh" ) -gt 1 ]
    then
    echo "true"
    fi
    #定义a和b两个变量,针对于相等,大于,小于进行三种提示
    a=10
    b=20
    if [ "${a}" -eq "${b}" ]
    then
         echo "相等"
    elif [ "${a}" -lt "${b}" ]
    then 
            echo "a小于b"
    else 
         echo "a大于b"
    fi
    #输出a小于b

    选择语句

  • 形式

  • 模式1若与值匹配则执行语句1,然后通过;;(相当于break)跳出,后面的不再执行
  • 每个模式后接一个)来划分模式内容
  • esac表示选择语句的结束标记
  • 例:
  • v="ccpc"
    case "${v}" in
    "ccpc")
    echo "中国大学生程序设计大赛"
    ;;
    "74181")
    echo "最著名的算术逻辑单元"
    ;;
    "Redhat")
    echo "红帽"
    ;;
    esac
    #输出中国大学生程序设计大赛

    循环语句

  • for循环

  • done为结束标记
  • loop相当于以前for循环定义的i变量
  • 首先loop为A,然后为B,C
  • 当所有循环全部执行就会走到done
  • 例:
  • #(依次输出A,B,C,D,E,F)
    for var in A B C D E F
    do
    echo "${var}"
    done
  • while循环

  • 如果条件为真,就会到循环体里执行
  • 如果条件为假,整个循环就停止了
  • done就是结束标记
  • 例:
  • #(依次输出1,2,3,4,5,6,7,8,9,10)
    a=1
    while [ "${a}" -le 10 ]
    do
    echo "${a}"
     ((a++))
    done

    函数

  • 无参无返回值的方法

 例:

  • method(){
     echo "我执行了"
    }
    #方法的调用
    method
    #(输出"我执行了")

    有参无返回值的方法

     例:

  • method2(){
     echo "接收到的第一个参数$1"
     echo "接收到的第二个参数$2"
    }
    #方法的调用
    method2 99 88
    #运行结果:
    #接收到的第一个参数99
    #接收到的第二个参数88

    有参有返回值

     例:

  • method3(){
     echo "接收到的第一个参数$1"
     echo "接收到的第二个参数$2"
     return $(($1 + $2))
    }
    #方法的调用
    method3 10 20
    echo $?
    #运行结果:
    #接收到的第一个参数10
    #接收到的第二个参数20
    #30

  • 练习
  • read 变量名 --- 表示把键盘录入的数据复制给这个变量
  • 例:
  • method(){
     echo "请录入第一个数"
     read number1
     echo "请录入第二个数"
     read number2
     echo "两个数字分别为${number 1},${number2}"
     return $(($number1 + $number2))
    }
    #方法的调用
    method
    echo $?
    #运行输出:
    #请录入第一个数
    #自己键盘打个数,这里举例录入10
    #请录入第二个数
    #自己键盘打个数,这里举例录入20
    #两个数字分别为10, 20
    #30

猜你喜欢

转载自blog.csdn.net/weixin_59624686/article/details/124658363