WHCSRL 技术网

shell脚本-变量、运算判断、if语句、for循环、函数

        Shell就是一款解释器软件,将shell 命令翻译成机器语言。
        解释:高级语言-->解释器 ( 编译器 )--> 机器码

一、shell种类

        

        查看默认shell: echo $SHELL ---默认shellbash

        查看有哪些shell:cat /etc/shells

        

 二、shell脚本

        (1)特点

                脚本文件中的内容是shell命令的集合,后缀名必须是.sh的一种文本文件。脚本声明#!/bin/bash(必须写在第一行),意在告诉计算机我们的脚本使用的是shell解释器是:/bin/bash。

                

                 

         (2)脚本应用场景

                重复操作;批量事务处理;自动化运维;定期任务执行;服务器运行监控。

        (3)shell程序执行

                ①交互式shell环境直接执行

                        即通过相对路径或者绝对路径来执行,要求脚本文件必须具有可执行权限。

                        第一步:赋予可执行权限(赋值法、加减法、数字法都可)

                        

                         第二步:执行

                        

                 ②使用解释器执行(推荐使用)--不需要获取可执行权限

                        格式: bash 脚本

                        

         (4)交互式赋值

                字符串输出:echo 字符串

                        

                 获取键盘输入,并保存到一个变量中

                        格式:read [-p "提示信息"] 变量名

                        

 三、变量

        变量代表的是一个存储空间,空间的名称就是变量名,通过变量名可以访问到空间中的值

        (1)变量的命名

                变量名只能包含字母、数字和下划线,并且不能以数字开头;区分大小写

                尽量做到见名知义

                

         (2)定义变量

                        变量名=变量的值

                        

         (3)变量的调用

                        方式一:$变量名

                                使用条件:变量的调用是在行尾(或单词的末尾)时可以使用

                        

                         方式二:${变量名}

                         

        (4)变量替换

                方式一,括号替换:$(命令1;命令2......)

                方式二,倒引号替换:`命令1;命令2......`

                作用:括号或倒引号内命令的执行结果(标准输出)会返回给当前shell,相当于产生了一个新的命令,其执行结果可以被echo或者被当前shell的命令所使用。

                举例:                        

                        addr = $(find . -name a.log)
                        cat $addr
                        ls_d = $(ls -l)
                        echo $ls_d

        (5)位置变量 

                使用场合:在使用脚本时,很多时候脚本中大部分代码都是固定的,区别只是传入的参数有所区别,这时候可以使用位置变量来实现参数的传递。代码中很多语句都是固定的,区别只在某些变量的取值不一样。

                

                 位置变量的使用:可以使用$1, $2, $3, ......,${10}${n} 来获取执行脚本时,传入的参数,这种变量就叫位置变量。

                

                 位置变量用来接收向shell脚本传递的参数,第一个参数用$1来获取,第二个参数用$2来获 取,以此类推。但$9以后的位置变量要写为${10}。($数字:是固定写法,用于接收指定位置的数据)

                使用步骤:

                        第一步:在脚本使用位置变量,来接收向shell脚本传递的参数

                        

                         第二步:在执行shell脚本时,同时向脚本传递参数,参数之间用空格隔开

                        

         (6)特殊变量

                $0:脚本名称自身

                

                 $?:上一条命令的执行状态,状态用数字表示:0-255

                        0:成功

                        

                         1-255:失败

                        

                         echo $? 执行结果为0,表示上一条命令执行成功

                $#:记录位置参数个数的总和

                

                $*: 详细列出所有的位置参数

                

                $$: 当前所在进程的进程号

                

四、变量的算术运算

        只支持整数的运算,不支持小数

        (1)算术运算符

                +,- *,/(取整),%%(取余)

                

                 += -=*=/=%%=

                

                自增自减。变量自增++,变量自减—                

                a ++ 相当于 a = a + 1
                a-- 相当于 a = a-1
                

         (2)算术运算

                进行运算的时候,如果直接运算,会当做一个字符串来使用,而不是当做数字进行运算

                

                算术运算方式:shell中,等号和运算符的左右不能有空格

                        

                        方式一: let varName=算术表达式

                                通过let执行算术运算,将算术表达式的运算结果赋值给变量varName

                                                                                注意包括括号必须使用在前面(方式二不受此规则限制)

                                

                        方式二: varName=$[算术表达式]

                                 

 五、条件判断

        方式一:test 条件表达式

        方式二:[ 条件表达式 ] [[ 条件表达式 ]](注意表达式两边和操作符两边都要有空格)

六、文件操作符

        -d:测试是否为目录(Directory

                

        -e:测试目录或文件是否存在(exist)

                

        -f:测试是否为普通文件(file) 

                 

        -r:测试当前用户是否有权限读取(read) 

                 

        -w:测试当前用户是否有权限写入(write)

        -x:测试当前用户是否可执行该文件

        -L:测试是否为符号连接(Link)文件

        注意:权限判断的时候不能使用root用户,root用户是超级管理员,具有所有的权限

                

七、 整数数值比较测试

        只能是整数

                

        格式: [ 数值1 操作符 数值2 ] ---条件表达式两边和操作符两边必须要有空格

        操作符:-eq等于(equal to

                

                 -gt大于(great than

                

              -ge大于等于(great or equal to

                   

                 -lt小于(less than

                

                 -le小于等于(less or equal to

                -ne不等于(not equal to

八、字符串比较测试

         格式:[ 字符串1 比较符 字符串2 ]

        操作符:= :字符串内容相同

                        

                 != :字符串内容不同

                        

             -z :字符串内容为空。格式:[ -z 字符串 ]

                            

 九、逻辑测试

        格式:[ 表达式1 ] 逻辑操作符 [ 表达式2 ]........[ 表达式n ]        

                ---逻辑操作符合表达式之间要有空格

        常用的测试条件的逻辑操作符:&&(与)、||(或)、!(非)

        

         

        总结: 在算术运算符中,运算符两边不能有空格,表示式两边可以有也可以没有空格。在条件运算中,运算符和表达式两边都必须要有空格。

 十、if语句

        (1)单分支:

  1. if 条件判断表达式; then
  2. statement1
  3. ……
  4. fi

        

       判断/home/admin目录下是否有文件passwd,如果有则打印文件存在

                

         (2)双分支:

  1. if condition; then
  2. statement1
  3. else
  4. statement2
  5. fi

         

        ·(3)多分支:

  1. if condition; then
  2. statement1
  3. elif condition; then
  4. statement2
  5. ……
  6. els
  7. statementn
  8. fi

        总结:第一步首先分析题目,确定有几个判断条件,根据判断条件,选择合适的if语句表达式 ;第二步先将表达式写入脚本,确保语法格式正确;第三步补充判断条件;第四步补充代码。

十一、循环语句-for   

        (1)格式:

  1. for 变量名 in 列表;do
  2. 循环体(正常执行的执行命令)
  3. 语句1
  4. 语句2
  5. 语句3
  6. ……
  7. done

        说明:当列表中有足够的值赋值给变量时,则执行循环体重的语句。当列表中没有足够的值赋值给变量时,则跳出循环,则循环结束。

        

         

         (2)列表

                方式一:{}

                        数字集合:{1..7} ---1-7之间的数字

                        字母集合:{a..g} ---a-g之间的字母

                方式二:

  1. 格式:
  2. `seq 初始值i 步长q 终止值d`
  3. 从初始值i开始取值,到终止值d为止,每取一次值增加步长q
  4. 步长:相邻两次之间的间隔
  5. 举例:
  6. `seq 1 2 100`

        

         

 十二、函数

        一段代码块,用于实现一定的功能,调用该函数,即可执行该代码块

        (1)函数定义:

  1. function 函数名() {
  2. 命令序列
  3. ……
  4. return xxx
  5. }

        

         (2)函数调用

                  格式: 函数名 参数1 参数2 ......

                        参数之间用空格隔开

                         

推荐阅读