1.shell是什么

shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动、挂起、停止一些程序。

  

2. shell脚本的执行方式

  • 脚本格式要求

    • 1.脚本以#!/bin/bash开头

    • 2.脚本需要可执行权限

  • 编写一个shell脚本,输出hello shell

    • #!/bin/bash

    • echo "hello shell "

    • mkdir /root/shcode

    • cd /root/shcode

    • vim hello.sh

    • 输入

  • 脚本的常用执行方式

    • 说明:首先要赋予helloshell.sh脚本的 +x 权限,

    • 再执行脚本chmod u+x hello.sh

    • ./hello.sh或者 /root/shcode/hello.sh

    • 方式1:(输入脚本的绝对路径或相对路径)

    • 方式2:(sh+脚本)

      说明:不用赋予脚本+x权限,直接执行即可。
      sh hello.sh

  

3.shell的变量

  • shell变量介绍
    1.Linux shell 中的变量分为,系统变量和用户自定义变量。

    2.系统变量: $HOME $PWD $SHELL $USER

    3.显示当前shell中所有变量:set

  • shell变量的定义

    • 基本语法
      1.定义变量: 变量名=值

      2.撤销变量: unset 变量

      3.声明静态变量:readonly 变量 ,但是不能unset

  • 案例

    • vim var.sh

    • #!/bin/bash

    • A=100

    • echo "A=$A"

    • 案例1:声明变量A

    • 案例2:撤销变量A

      unset A

    • 案例3:声明静态的变量B,不能unset

      readonly B

 

  • shell变量的定义

    • 定义变量的规则
      1.变量名称可以由字母、数字、和下划线组成,但是不能以数字开头。 5A=100 (x)

      2.等号两侧不能有空格

      3.变量名称一般习惯为大写,这是一个规范

    • 将命令的返回值赋给变量
      1.A=date反引号, 运行命令,并把结果返回给变量A

      2.A=$(date) 等价于反引号

  

4.设置环境变量

  • 基本语法

    1. export 变量名=变量值 功能描述:将shell变量输出为环境变量/全局变量

    2. source 配置文件 功能描述:让修改后的配置信息立即生效

    3. echo $变量名 功能描述:查询环境变量的值

  • 案例

    1. 在/etc/profile文件中定义TOMCAT_HOME环境变量
      ….

    2. 查看环境变量TOMCAT_HOME的值
      ….

    3. 在另一个shell程序中使用 TOME_HOME
      ….

  • 注意:
    在输出TOMCAT_HOME环境变量前,需要让其生效
    source /etc/profile

  • shell脚本的注释

    • shell脚本单行注释 采用 #开头

    • shell脚本多行注释 :<<! 多行注释内容 !

  

5.位置参数变量

当我们执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量。
比如: ./myshell.sh 100 200 这就是一个执行shell的命令行,就可以在myshell脚本中获取到参数信息

  • 基本语法
    1.$n 功能描述:n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数需要使用大括号包含,如${10}

    2.$* 功能描述:这个变量代表命令行中的所有参数 ,此命令把所有参数看成一个整体

    3.$@ 功能描述:这个变量也代表命令行中的所有的参数,但是此命令把每个参数区分对待

    4.$# 功能描述:这个变量代表命令行中的所有参数的个数

  • 位置参数变量

    • #!/bin/bash

    • echo "0=$0 1=$1 2=$2"

    • echo "所有的参数=$*"

    • echo "$@"

    • echo "参数的个数=$#"

    • 执行 sh position.sh 100 200

    • 输出结果

    • 0=./position.sh 1=100 2=200

    • 所有的参数=100 200

    • 100 200

    • 参数的个数=2

    • 案例:编写一个shell脚本position.sh,在脚本中获取到命令行的各个参数信息

  

6.预定义变量

就是shell脚本设计者事先已经定义好的变量,可以直接在shell脚本中使用

  • 基本语法

    1. $$ 功能描述:当前进程的进程号(PID)

    2. $! 功能描述:后天运行的最后一个进程的进程号(PID)

    3. $? 功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值非0(具体的数字由命令本身来决定),则证明上一条命令执行不正确。

  • 应用案例

    在一个shell脚本中简单使用预定义变量
    prevar.sh

  

7.运算符

  • 基本语法

    1. "$((运算式))" 或 "$[运算式]" 推荐使用 或者 expr m + n

    2. 注意expr运算符间要有空格

    3. expr m-n

    4. expr \*, / , % 乘,除,取余

  • 应用实例

    • vim oper.sh

    • #!/bin/bash

    • SUM=$[$1+$2]

    • echo "sum=$SUM"

    • ./oper.sh 20 50

    • 案例1:计算(2+3)*4
      1.$(((2+3)*4))

      2.$[(2+3)*4]

      3.TEMP=expr (2 + 3)`

      4.RES=expr TEMP * 4“

    • 案例2:求出命令行的两个参数[整数]的和

  

8.条件判断

  • 判断语句

    • 基本语法
      [ condition ] 注意condition前后要有空格

      非空返回true,可使用$?验证(0为true,>1为false)

  • 应用实例

    [] true

    [] false

    [ condition ] && echo OK || echo notok 条件满足,执行后边语句

  • 常用判断条件

    1. = 字符串比较

    2. 两个整数的比较

      -lt 小于

      -le 小于等于 little equal

      -eq 等于

      -gt 大于

      -ge 大于等于

      -ne 不等于

    3. 按照文件权限进行判断

      -r 有读的权限

      -w 有写的权限

      -x 有执行的权限

    4. 按照文件类型进行判断

      -f 文件存在并且是一个常规的文件

      -e 文件存在

      -d 文件存在且是一个目录

  • 使用案例

    • 案例1: 判断"ok" 是否等"ok"

      判断语句 =

    • 案例2: 23是否大于等于22

      判断语句 -ge

    • 案例3: /root/shcode/aaa.txt目录中的文件是否存在

      判断语句 -f

9.流程控制

  • if判断

    • if [条件判断式] then 代码 fi

    • if [条件判断表达式] then 代码 elseif [条件判断表达式] 代码 fi

    • [ 条件判断式 ] ,中括号和条件判断式之间必须有空格

    • 基本语法

  • 应用实例 ifcase.sh
    编写shell程序,如果输入的参数大于等于60,输出及格了,如果输入小于60,输出不及格。

    #!/bin/bash
    if [ $1 -ge 60 ]
    then
    echo "及格"
    elif [ $1 -lt 60 ]
    then
    echo "不及格"
    fi

  • case语句

    • case $变量名 in "1")

      如果变量的值等于值1,则执行程序1

    • ;; "2")

      如果变量的值等于值2,则执行程序2

    • ;; "* ")

      如果变量的值都不是以上的值,则执行此程序

    • ;; esac

    • 基本语法

  • 应用案例

    当命令行参数是1时,输出周一,当是2时,输出周二,其他情况输出other

    #!/bin/bash
    case $1 in
    "1")
    echo "周一"
    ;;
    "2")
    echo "周二"
    ;;
    *)
    echo "other"
    ;;
    esac

  • for 循环

    for ((初始值;循环控制条件;变量变化)) do 程序 done

    • 基本语法1
      for 变量 in 值1 值2 值3 ... do 程序/代码 done

    • 基本语法2

  • while循环

    • 基本语法1

      while [ 条件判断式 ] do 程序 done

  

10.read读取控制台输入

  • 基本语法
    read(选项)(参数)

    1. 选项
      -p 功能:指定读取值时的提示符;

      -t 功能:指定读取值时等待的时间(秒),如果没有在指定的时间输入,就不再等待了。

    2. 参数
      变量: 指定读取值的变量名

  • 应用实例 testRead.sh

    案例1:读取控制台输入一个num值

    案例2:读取控制台输入一个num值,在10秒内输入

    #!/bin/bash
    read -p "请输入一个数NUM1=" NUM1
    echo "你输入的数NUM1=$NUM1"
    read -t 10 -p "请输入一个数NUM2=" NUM2
    echo "你输入的数NUM2=$NUM2"

  

11. 函数

shell编程和其他编程语言一样,有系统函数,也可以自定义函数。

  • 系统函数

    1. basename基本语法 功能:返回完整路径最后/的部分,常用于获取文件名

      basename pathname suffix

      basename string suffix 功能描述:basename命令会删掉所有的前缀包括最后一个'/'字符,然后将字符串显示出来。

      选项:suffix为后缀,如果指定了suffix,basename会将pathname或string中的suffix去掉

  • 应用实例
    请返回/home/aaa/test.txt的test.txt的部分

    指令:

    执行结果: test

    • basename /home/aaa/test.txt
      执行结果: test.txt

    • basename /home/aaa/test.txt .txt

  1. dirname基本语法
    功能:返回完整路径最后/的前面的部分,常用于返回路径部分

    dirname 文件绝对路径 功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)

    应用案例
    案例1:请返回/home/aaa/test.txt的/home/aaa

    指令: dirname /home/aaa/test.txt

  2. 自定义函数

    1. 基本语法
      [function] funname[()] { action; [return int;] }

    2. 调用直接写函数名 funname [值]

    3. 应用实例
      1. 计算输入两个参数的和,getSum

      #!/bin/bash
      #计算输入两个参数的和,getSum

      # 定义函数getSum
      function getSum()
      {
      SUM=$[ $n1+$n2 ]
      echo "和是=$SUM"
      }

      #输入两个值
      read -p "请输入一个值n1=" n1

      read -p "请输入一个值n2=" n2


转自:https://www.cnblogs.com/lsh-admin/p/14896918.html