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[@]} #计算数组种元素的个数

相关推荐
YCyjs1 小时前
云计算【第一阶段(27)】DHCP原理与配置以及FTP的介绍
linux·运维·服务器·云计算
新手小新1 小时前
关于新装Centos7无法使用yum下载的解决办法
linux·运维·centos
CodeWithMe2 小时前
【计算机】同步/异步
linux
Yumpie_2 小时前
自动化流程梳理
运维·自动化
Peterpan000002 小时前
玄机——第五章 linux实战-黑链 wp
linux·运维·服务器·网络安全·安全威胁分析
xuyanqiangCode2 小时前
八、Linux二进制安装Kafka集群
linux·运维·kafka
临桥2 小时前
firewalld 高级配置
linux·服务器·网络
a未来永远是个未知数2 小时前
构建机部署之git安装(Linux)
linux·git·elasticsearch
疯狂的rabbit.2 小时前
Linux防火墙
linux·运维·服务器·云计算·redhat·rhce·openeular
懒大王爱吃狼3 小时前
【Python自动化】Python实现微信自动回复(简单上手),60行代码轻松搞定!个性化自动回复机器人,零基础可学!
运维·开发语言·python·数据分析·自动化·学习方法