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

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

 目录

一、什么是Shell?

二、 编写第一个Shell脚本

编辑

2.2 变量

2.3 功能语句

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          #执行脚本

image.gif

image.gif 编辑

2.2 变量

  • 自定义变量:通常大写,直接赋值无需类型声明。
一般用大写
进行赋值时用=,左右两边不能有大写
引用变量前面加$
VAR=10
echo $VAR 
#10

image.gif

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

image.gif

  • 预定义变量$?记录最后命令的退出状态,$$表示当前进程ID。
$? 包含前一个命令的退出状态(0表示真 非0表示假)
$$ 包含正在执行进程的ID号

image.gif

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

image.gif

2.3 功能语句

  • 注释:使用#标记。
  • 算术运算exprlet命令。
算数运算符命令expr主要用于进行简单的算数运, 包括+ - \* / %等操作。
#!/bin/bash
VAR=10
NUM=`expr \( 2 + $VAR \) \* 4`
echo $NUM
48

image.gif

  • 输入读取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

image.gif

  • 条件测试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 $?

image.gif

  • 控制结构
  • 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]

image.gif

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

image.gif

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

image.gif

  • 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语言

image.gif

  • 循环控制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

image.gif

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

image.gif

  • 引用
  • "${array[i]}"访问特定元素。
  • "${array[@]}"遍历所有元素。
  • "${#array[@]}"获取元素总数。
${array[i]}  #数组下标i从0开始到n-1结束
array[i]=3 #对数组元素重新赋值
${array[@]} #遍历数组
${#array[@]} #计算数组种元素的个数

image.gif


相关文章
|
17天前
|
Shell Linux 测试技术
6种方法打造出色的Shell脚本
6种方法打造出色的Shell脚本
39 2
6种方法打造出色的Shell脚本
|
3天前
|
XML JSON 监控
Shell脚本要点和难点以及具体应用和优缺点介绍
Shell脚本在系统管理和自动化任务中扮演着重要角色。尽管存在调试困难、可读性差等问题,但其简洁高效、易于学习和强大的功能使其在许多场景中不可或缺。通过掌握Shell脚本的基本语法、常用命令和函数,并了解其优缺点,开发者可以编写出高效的脚本来完成各种任务,提高工作效率。希望本文能为您在Shell脚本编写和应用中提供有价值的参考和指导。
12 1
|
4天前
|
存储 Python
Python自动化脚本编写指南
【10月更文挑战第38天】本文旨在为初学者提供一条清晰的路径,通过Python实现日常任务的自动化。我们将从基础语法讲起,逐步引导读者理解如何将代码块组合成有效脚本,并探讨常见错误及调试技巧。文章不仅涉及理论知识,还包括实际案例分析,帮助读者快速入门并提升编程能力。
21 2
|
6天前
|
运维 监控 Python
自动化运维:使用Python脚本简化日常任务
【10月更文挑战第36天】在数字化时代,运维工作的效率和准确性成为企业竞争力的关键。本文将介绍如何通过编写Python脚本来自动化日常的运维任务,不仅提高工作效率,还能降低人为错误的风险。从基础的文件操作到进阶的网络管理,我们将一步步展示Python在自动化运维中的应用,并分享实用的代码示例,帮助读者快速掌握自动化运维的核心技能。
18 3
|
8天前
|
Ubuntu Shell 开发工具
ubuntu/debian shell 脚本自动配置 gitea git 仓库
这是一个自动配置 Gitea Git 仓库的 Shell 脚本,支持 Ubuntu 20+ 和 Debian 12+ 系统。脚本会创建必要的目录、下载并安装 Gitea,创建 Gitea 用户和服务,确保 Gitea 在系统启动时自动运行。用户可以选择从官方或小绿叶技术博客下载安装包。
22 2
|
12天前
|
运维 监控 应用服务中间件
自动化运维:如何利用Python脚本提升工作效率
【10月更文挑战第30天】在快节奏的IT行业中,自动化运维已成为提升工作效率和减少人为错误的关键技术。本文将介绍如何使用Python编写简单的自动化脚本,以实现日常运维任务的自动化。通过实际案例,我们将展示如何用Python脚本简化服务器管理、批量配置更新以及监控系统性能等任务。文章不仅提供代码示例,还将深入探讨自动化运维背后的理念,帮助读者理解并应用这一技术来优化他们的工作流程。
|
13天前
|
运维 监控 Linux
自动化运维:如何利用Python脚本优化日常任务##
【10月更文挑战第29天】在现代IT运维中,自动化已成为提升效率、减少人为错误的关键技术。本文将介绍如何通过Python脚本来简化和自动化日常的运维任务,从而让运维人员能够专注于更高层次的工作。从备份管理到系统监控,再到日志分析,我们将一步步展示如何编写实用的Python脚本来处理这些任务。 ##
|
14天前
|
Ubuntu Linux Shell
Linux 系统中的代码类型或脚本类型内容
在 Linux 系统中,代码类型多样,包括 Shell 脚本、配置文件、网络配置、命令行工具和 Cron 定时任务。这些代码类型广泛应用于系统管理、自动化操作、网络配置和定期任务,掌握它们能显著提高系统管理和开发的效率。
|
17天前
|
运维 Prometheus 监控
自动化运维之路:从脚本到DevOps
【10月更文挑战第25天】在数字化时代的浪潮中,运维不再是简单的服务器管理,而是成为了企业竞争力的核心。本文将带你走进自动化运维的世界,探索如何通过技术手段提升效率和稳定性,以及实现快速响应市场的能力。我们将一起学习如何从基础的脚本编写进化到全面的DevOps实践,包括工具的选择、流程的优化以及文化的建设。无论你是运维新手还是资深专家,这篇文章都将为你提供有价值的见解和实用的技巧。
17 3
|
18天前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。