Linux Shell 脚本入门教程:开启你的自动化之旅

目录

一、什么是Shell?

[二、 编写第一个Shell脚本](#二、 编写第一个Shell脚本)

​编辑

[2.2 变量](#2.2 变量)

[2.3 功能语句](#2.3 功能语句)

[2.4 数组](#2.4 数组)


一、什么是Shell?

Shell是一种计算机程序,它充当了用户与操作系统之间的接口。在Linux系统中,Shell允许用户通过命令行界面(CLI)来控制计算机。Shell脚本则是一种使用Shell语言编写的脚本,它可以自动执行一系列的命令,帮助用户实现任务自动化,提高工作效率。

二、 编写第一个Shell脚本
  1. 创建脚本文件 :使用文本编辑器(如vi、nano)创建文件,推荐扩展名为.sh

  2. 添加执行权限 :运行chmod +x filename.sh

  3. 编写脚本 :首行添加#!/bin/bash#!/bin/sh作为shebang,指示Shell解释器类型。

     新建一个shell脚本: touch xx.sh
     第一行:#!/bin/bash
     意思是使用/bin/bash来解释执行
     
     执行方式:
     sudo chmod 权限 ./xx.sh  	 #使脚本具有执行权限
     ./xx.sh					 #执行脚本
    
2.2 变量
  • 自定义变量:通常大写,直接赋值无需类型声明。

    一般用大写
    进行赋值时用=,左右两边不能有大写
    引用变量前面加$

    VAR=10
    echo $VAR
    #10

  • 位置参数$0代表脚本名称,$1, $2, ... 表示参数。

    0或者{0}与输入的命令行一样,表示包含脚本名./xx.sh的参数
    $1,$2,$3...表示命令行输入的剩下的参数
    $# 表示包含命令行参数的个数(不包含脚本文件名这个参数)
    $@ $* 包含命令行所有参数:"$1 $2 $3..."

  • 预定义变量$?记录最后命令的退出状态,$$表示当前进程ID。

    $? 包含前一个命令的退出状态(0表示真 非0表示假)

    包含正在执行进程的ID号

    环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。
    $HOME: /etc/passwd文件中列出的用户主目录
    $PATH :shell搜索路径,就是是一系列目录,当执行命令时,linux就在这些目录下查找。

2.3 功能语句
  • 注释 :使用#标记。

  • 算术运算exprlet命令。

    算数运算符命令expr主要用于进行简单的算数运, 包括+ - * / %等操作。

    #!/bin/bash
    VAR=10
    NUM=expr \( 2 + $VAR \) \* 4
    echo $NUM
    48

  • 输入读取read命令,read -p提供输入提示。

    功能:read从标准输入读入一行,并赋值给后面的变量
    格式:read VAR1 VAR2 VAR3
    把读入行中的第一个单词赋值给VAR1,第二个单词赋值给VAR2,第三个单词赋值给VAR3,以此类推。
    read -p "提示语句" 变量名列表:可以将提示语句输出,同时输入变量。
    类似 scanf

    read a b c d

    read -p "字符串" a b c d

  • 条件测试test或方括号[]用于测试字符串、整数和文件属性。

    可测试对象:字符串 整数 文件属性
    每种测试对象都有若干个操作符
    字符串的测试:
    s1 = s2 测试两个字符串是否完全一样
    s1 != s2 测试两个字符串是否有差异
    -z s1 测试s1字符串的长度是否为0
    -n s1 测试s1字符串的长度是否不为0

    整数的测试:
    a -eq b 测试a和b是否相等 eqaul
    a -ne b 测试a和b是否不相等 not equal
    a -gt b 测试a是否大于b grater than
    a -ge b 测试a是否大于等于b grater equal
    a -lt b 测试a是否小于b litter than
    a -le b 测试a是否小于等于b litter equal

    (3)文件属性测试:
    -d name 测试name是否为一个目录
    -f name 测试name是否为普通文件
    -e name 测试文件是否存在

    #!/bin/bash

    #测试字符串
    VAR="hello"
    test $VAR = "hello"
    echo $?

    test $VAR != "hello111"
    echo $?

    #测试整数
    NUM=10
    test $NUM -eq 1
    echo $?

    test $NUM -ne 1
    echo $?

    test $NUM -gt 0
    echo $?

    test $NUM -lt 0
    echo $?

    #测试文件
    read FILE #从终端读取一个字符串赋值给变量FILE
    test -e $FILE
    echo $?

    test -d $FILE
    echo $?

    test -f $FILE
    echo $?

  • 控制结构

    • If语句:支持基本、多路和嵌套条件。

      基本结构
      if 条件
      then
      命令1
      else
      命令2
      fi

      多路分支结构:
      if 条件1
      then
      命令表1
      elif 条件2
      then
      命令表2
      else
      命令表3
      fi

      嵌套结构:
      if 条件
      then
      if 条件
      then
      命令表1
      fi
      else
      命令表2
      fi

      补充操作符:
      -o 或运算 例如 [ $a -lt 20 -o $b -gt 100 ] 返回 true
      -a 与运算 例如 [ $a -lt 20 -a $b -gt 100 ] 返回 false
      ! 非运算 例如 [ ! false ] 返回 true
      && 逻辑与 例如 [[ $a -lt 100 && $b -gt 100 ]] 返回 false
      || 逻辑或 例如 [[ $a -lt 100 || $b -gt 100 ]] 返回 true
      | 位或 例如 echo $[2|2]
      &位与 例如 echo $[2&1]

  • Case语句:模式匹配。

    格式:
    case 变量 in
    模式1)
    命令表1
    ;;
    模式2)
    命令表2
    ;;
    *)
    命令表3
    ;;
    esac
    也可以用+\或者其他的字符来实现输入特殊字符就可以执行命令

  • While循环:基于条件的循环。

    格式:
    while 命令或表达式
    do
    命令表
    done

    执行顺序:
    while语句首先测试其后的命令或表达式的值,如果为真,就执行一次循环体中的命令,然后再测试该命令或表达式的值,执行循环体,直到该命令或表达式为假时退出循环。

  • For循环:遍历列表或范围。

    格式
    for 变量名 in 单词表
    do
    命令表
    done

    执行顺序:
    变量依次取单词表中的各个单词, 每取一次单词, 就执行一次循环体中的命令. 循环次数由单词表中的单词数确定. 命令表中的命令可以是一条, 也可以是由分号或换行符分开的多条。

    for语句的几种书写格式:
    1)for i in 1 2 3 4 do....done :
    变量i从单词表中取值
    2)for i do...done:
    变量i从命令行取值,可以省略in 单词表
    3)for i in {1..10} do...done:
    变量i从1-10个数中取值
    4)for ((i = 0; i < 10; i++)) do...done:
    书写格式类似c语言

  • 循环控制breakcontinue分别用于跳出和跳过循环。

    break n: 结束n层循环
    continue n:结束n层循环,继续下一次循环
    for ((i=1;i<5;i++ ))
    do
    if [ $i -eq 3 ]
    then
    # break
    # continue
    # exit
    fi
    echo $i
    done
    echo OK
    输出的结果
    break的结果
    1
    2
    OK
    continue的结果
    1
    2
    4
    OK

2.4 数组
  • 赋值 :直接赋值或通过read命令。

    array=(1 2 3 4 5)
    array1=($1 $2 $3 4) read a b c array2=(a $b $c)
    read -a array4

  • 引用

    • "${array[i]}"访问特定元素。

    • "${array[@]}"遍历所有元素。

    • "${#array[@]}"获取元素总数。

      {array[i]} #数组下标i从0开始到n-1结束 array[i]=3 #对数组元素重新赋值 {array[@]} #遍历数组
      ${#array[@]} #计算数组种元素的个数

相关推荐
vfbox339826 分钟前
C-DTL698电表 转 IEC61850 协议项目案例
物联网·iec61850·vfbox·协议转换工业网关·c-dtl698
二十雨辰41 分钟前
[linux]docker基础
linux·运维·docker
Jason-河山1 小时前
【自动化更新,让商品信息跳舞】——利用API返回值的幽默编程之旅
运维·自动化
饮浊酒1 小时前
Linux操作系统 ------(3.文本编译器Vim)
linux·vim
lihuhelihu1 小时前
第3章 CentOS系统管理
linux·运维·服务器·计算机网络·ubuntu·centos·云计算
矛取矛求2 小时前
Linux系统性能调优技巧
linux
One_Blanks2 小时前
渗透测试-Linux基础(1)
linux·运维·安全
Perishell2 小时前
无人机避障——大疆与Airsim中的角速度信息订阅获取
linux·动态规划·无人机
爱吃喵的鲤鱼2 小时前
linux进程的状态之环境变量
linux·运维·服务器·开发语言·c++
dessler2 小时前
Linux系统-ubuntu系统安装
linux·运维·云计算