浅尝shell

80 阅读3分钟

Shell

概述

  • Linux系统中的Shell脚本是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个“命令解释器”的角色,负
    责接收用户输入的操作指令(命令) 并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。

Shell类型

image-20240620163155829

  • 查看当前系统支持的Shell版本
echo $SHELL

image-20240620163444452

变量

  • 创建变量本质是向系统申请存储空间,用于存储可能发生变化的数据;

分类

系统变量(全局)
  • 一旦创建,则可以在系统任意位置使用该变量数据;
普通变量
  • 创建在文件或函数中,只能在创建变量的文件或函数中使用;

语法

  • 创建变量
#变量名称取名必须符合以下要求(命名规范):#由数字、字母、下划线组成(_);#数字不开头;#做到见名知义;#避免关键字变量名称=数据
  • 删除变量
unset 变量名称
  • 数据包含特殊符号的字符串需要使用双引号或单引号括起来
变量名称="字符串"变量名称='字符串'

image-20240620164939077

  • 输出变量值
echo $变量名称

image-20240620165332260

  • 嵌套使用变量,必须使用双引号将内容括起来
变量名称1="字符串内容$变量名称2"变量名称1="${变量名称2}字符串内容"

image-20240620165311130

image-20240620171928634

shell文件创建

创建文件

touch 文件路径/文件名称.shvi 文件路径/文件名称.sh

编辑文件内容

  • 必须以#!/bin/bash开头

image-20240620165904956

执行shell文件

方式一
  • 最常用,不需要执行权限
sh 目标文件路径

image-20240620170146353

方式二
  • 最常用,不需要执行权限
. 目标文件路径

image-20240620170236941

方式三
  • 需要执行权限
./目标文件路径

image-20240620170346033

方式四
  • 最不常用,不需要执行权限
source 目标文件路径

image-20240620170450898

预定义变量

  • $0:获取文件名称;
  • $数字:数字取值范围[1,9],获取对应位置传入文件的数据(文件传参);
  • $#:预定义参数个数(传入文件的数据个数);
  • $*:以整体字符串形式输出所有传入数据;
  • $@:分别输出所有传入数据;
  • $?:获取上一次命令执行状态,0表示执行成功,大于0表示失败

image-20240620175010059

输入与输出

  • 输入
read -p "提示说明文本" 变量名称
  • 输出
echo 数据echo $变量名称

image-20240620175625040

算术运算符

  • +加法
  • -减法
  • *乘法
  • /除法
  • %取余(取模)
`expr 表达式`((表达式))

image-20240621094035867

比较运算符

  • -gt:大于,表示greater than
  • -lt:小于,表示less than
  • -ge:大于等于,表示greater than or equals
  • -le:小于等于,表示less than or equals
  • -eq:等于,表示equals
  • -ne:不等于,表示not equals
#结果为010表示为真(关系成立),1表示为假(关系不成立)test 表达式[ 表达式 ]test 选项 路径选项:-f 判断文件是否存在,且类型为文件类型-d 判断文件夹是否存在,且类为文件夹类型

image-20240621100133956

image-20240621100546411

逻辑运算符

  • &&:与,表示并且,符号左右条件结果都为真,则结果为真,否则为假
  • ||:或,表示或者,符号左右条件结果有至少一个为真,则结果为真,否则为假(左右条件都为假)

image-20240621101415743

分支

if-elif-else

if 条件;then    条件体elif 条件;then    条件体.....else    条件体fi
  • 判断当前主机是否能与指定主机通信

image-20240621104015675

  • 判断文件是否存在以及文件类型

image-20240621104559929

  • 判断成绩等级

image-20240621113648438

  • 判断成绩等级(优化版)

image-20240621114113944

case(了解)

case 变量 in值1)    条件体;;值2)    条件体;;.....*)    条件体esac
  • 根据月份判断当月总天数

image-20240621115247736

循环

for(掌握)

  • ++:自增,在原值基础上加1
  • --:自减,在原值基础上减1
#大于 >#小于 <#等于 ==#大于等于 >=#小于等于 <=#不等于  !=for((初始化①;条件②;步进③))do    循环体④done① ->-> 退出循环执行① ->->->->-> 退出循环执行① ->->->->->->->-> 退出循环执行① ->->->->->->->-> .... 退出循环执行for((count=1;count<11;count++))do    echo "Hello"done
  • 命令行输出10次Hello

image-20240621120528865

  • 运算1到指定数num的累加结果;

image-20240621141129496

  • 测试指定网段主机是否能通信

image-20240621152255669

image-20240621152218450

while(了解)

while [ 条件① ]do    循环体②done① -> 退出循环① ->->-> 退出循环① ->->->-> ① ...... -> 退出循环
  • 计算1到n的累加结果

image-20240621155230203

until(了解)

#条件为退出循环条件until [ 条件 ]do    循环体done

image-20240621161243429

for-in(掌握)

for 变量 in 值1 值2 值3 .....do    循环体done

image-20240621161527480

for 变量 in {起始值..结束值}do    循环体done

image-20240621161748649

select(了解)

select 变量 in 值1 值2 值3 .....do    循环体doneselect 变量 in {起始值..结束值}do    循环体done

image-20240621162042486

image-20240621162157888

循环控制

break
  • 立即结束当层整个循环

image-20240621162742534

continue
  • 结束当层本次循环,继续下一次循环

image-20240621162947301

循环嵌套

#!/bin/bashfor i in {1..10}do    for j in {10..20}    do        echo "i=${i},j=${j}"    donedone

image-20240621164953959

函数

  • 为指定代码块取个名字,后期要执行该代码可以通过该名称定位代码进行执行;
  • 优点:提高代码重用率、减少代码冗余;

语法

定义
function 函数名称(){    函数体    return 值}
function sum(){    re=0    read -p "num1:" $num1    read -p "num2:" $num1    re=`expr $num1 + $num2`    echo $re}
调用
函数名称

案例

  • 无参数无返回值

image-20240621171105631

  • 有参无返回值

image-20240621171332618

  • 有参有返回值

image-20240621171849479

sed

  • 可以实现文件内容的编辑(替换、插入、删除、修改)。

添加

#在指定行数后添加指定内容sed '行数a 内容'  文件路径#在指定行数前添加指定内容sed '行数i 内容'  文件路径

passwd文件中的第1行后添加*******行内容

image-20240621174005652

  • passwd文件中的第1行前添加*******行内容

image-20240621174046243

修改

sed '行数c 内容' 文件路径sed '起始行数,结束行数c 内容' 文件路径
  • passwd文件中的第2行进行修改为*******

image-20240621174248824

  • passwd文件中的第2到5行进行修改为*******

image-20240621174357037

删除

sed '行数d' 文件路径sed '起始行数,结束行数d' 文件路径
  • passwd文件中的第2行进行删除

image-20240621174456798

  • passwd文件中的第2到5行进行删除

image-20240621174541531

查看

sed -n '行数p' 文件路径sed -n '起始行数,结束行数p' 文件路径
  • passwd文件中的第2行内容输出

image-20240621174650941

  • passwd文件中的第2到5行内容输出

image-20240621174724065

替换

sed 's/旧的内容/新的内容/g' 文件路径
  • passwd文件中的sbin替换为~

image-20240621174900461

持久化

sed -i 操作 文件路径
  • passwd文件中的sbin替换为~,并写入到源文件(passwd)中

image-20240621175015363

awk

  • 实现文本内容分割(切割)
awk -F '分隔符' '{print $数字}' 文件名称
  • passwd文件每行内容以:作为分隔符进行分割,取出分割的第1个数据

image-20240621175358921

at

  • 一次性定时任务,默认未安装,需要自行下载。

命令

  • 服务名称为atd
#启动服务systemctl start atd
  • 创建定时任务
at now+时间单位>执行的命令>ctrl+d保存并退出单位:minute(s)、hour(s)、day(s)
  • 1分钟后执行指定任务

image-20240621180246994

crontab

  • 执行周期性的定时任务(按指定时间周期性完成)。

命令

创建

image-20240621180740622

crontab -e* * * * * 用户名 命令
  • 每周3执行指定任务

image-20240621180924918

查看
crontab -l

image-20240621181005328

删除
crontab -r

image-20240621181053116

取别名

  • 可以为常用命令取别名,简化命令执行

命令

alias 别名='命令内容'

案例

alias cnet='cd /etc/sysconfig/network-scripts'

image-20240621182630479