Linux|一文带你学会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
  • 判断语句
  • Linux|一文带你学会Shell基操
    文章图片

  • 第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

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

    循环语句
  • for循环Linux|一文带你学会Shell基操
    文章图片

  • 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循环Linux|一文带你学会Shell基操
    文章图片

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

    函数
  • 无参无返回值的方法Linux|一文带你学会Shell基操
    文章图片
例:
  • method(){ echo "我执行了" } #方法的调用 method #(输出"我执行了")

    有参无返回值的方法Linux|一文带你学会Shell基操
    文章图片

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

    有参有返回值Linux|一文带你学会Shell基操
    文章图片

    例:
  • 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


    推荐阅读