一、概述:

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。

Shell 编程跟 java、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。

Linux 的 Shell 种类众多,常见的有:

  • Bourne Shell(/usr/bin/sh或/bin/sh)
  • Bourne Again Shell(/bin/bash)
  • C Shell(/usr/bin/csh)
  • K Shell(/usr/bin/ksh)
  • Shell for Root(/sbin/sh)

二、语法

1.规范 注释
    #! /bin/bash 标识该文件为shell脚本
    #FileName:test.sh 标识文件名
    #auto 脚本的作用描述
    #authors by wzw 20190406 标识作者时间

2.变量定义
    your_name="runoob.com"
    命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
    中间不能有空格,可以使用下划线(_)。
    不能使用标点符号。
    不能使用bash里的关键字(可用help命令查看保留关键字)。
    变量使用:"$变量名"

3.参数
    $0 代表文件名
    $n 当前程序的第 n 个参数,n=1,2,…9
    $* 当前程序的所有参数
    $# 当前程序的参数个数(不包括程序本身)
    $? 命令或程序执行完后的状态,一般返回 0 表示执行成功。
    $UID 当前用户的 ID
    $PWD 当前所在的目录

4.流程控制
    1> 选择语句
        if单分支语句
            if((num>100)); then
                  echo "num is greate 100"
            fi
            逻辑运算符
                -f 判断文件是否存在 eg: if [ -f filename ]
                -d 判断目录是否存在 eg: if [ -d dir ]
                -eq 等于 应用于:整型比较
                -ne 不等于 应用于:整型比较
                -lt 小于 应用于:整型比较
                -gt 大于 应用于:整型比较
                -le 小于或等于 应用于:整型比较
                -ge 大于或等于 应用于:整型比较
                -a 双方都成立(and) 逻辑表达式 –a 逻辑表达式
                -o 单方成立(or) 逻辑表达式 –o 逻辑表达式
                -z 空字符串
        if ... then ...elif...else多分支语句
        case语句:

           case 值 in
               模式1)
               command1
               command2
               ...
               commandN
               ;;
              模式2)
                command1
                command2
                   ...
                commandN
                ;;
             esac

eg:
echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
    1)  echo '你选择了 1'
    ;;
    2)  echo '你选择了 2'
    ;;
    3)  echo '你选择了 3'
    ;;
    4)  echo '你选择了 4'
    ;;
    *)  echo '你没有输入 1 到 4 之间的数字'
    ;;
esac

    2> 循环语句
        for循环
            for 变量 in item1 item2 item3   
            do   
                echo $变量  
            done
         例:for loop in 1 2 3 4 5
                do
                       echo "The value is: $loop"
                done   

        while循环
            while condition
           do
                command
            done
      
        until循环
            until condition
            do
                  command
            done

break跳出循环:

#!/bin/bash
while :
do
    echo -n "输入 1 到 5 之间的数字:"
    read aNum
    case $aNum in
        1|2|3|4|5) echo "你输入的数字为 $aNum!"
        ;;
        *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
            break
        ;;
    esac
done

continue跳出当前循环:

#!/bin/bash
while :
do
    echo -n "输入 1 到 5 之间的数字: "
    read aNum
    case $aNum in
        1|2|3|4|5) echo "你输入的数字为 $aNum!"
        ;;
        *) echo "你输入的数字不是 1 到 5 之间的!"
            continue
            echo "游戏结束"
        ;;
    esac
done

5.shell数组
    一维数组的定义
        name(item1 item2 ....)
    一维数组的赋值和修改
        name[1]=123
    一维数组取值
        ${name[0]}
    获取数组长度
        ${#name[@]}
        ${#name[*]}
    删除数组
        删除单个元素
            unset name[i]
        删除数组
            unset name

    遍历数组
        1.标准的for循环

for(( i=0;i<${#array[@]};i++)) do
                    #${#array[@]}获取数组长度用于循环
                    echo ${array[i]};
             done;

        2.for … in循环
  

for element in ${array[@]}
                 #也可以写成for element in ${array[*]}
            do
                  echo $element
            done

        3.While循环法

i=0  
             while [ $i -lt ${#array[@]} ]  
                   #当变量(下标)小于数组长度时进入循环体
                  do  
                      echo ${ array[$i] }  
                       #按下标打印数组元素
                       let i++  
                  done

6.shell函数
    函数的定义

function test_function(){
             #函数体内容
          }

    函数的调用
        直接通过方法名称调用:test_function()