iis服务器助手广告广告
返回顶部
首页 > 资讯 > 操作系统 >linux shell脚本学习指南
  • 709
分享到

linux shell脚本学习指南

2024-04-02 19:04:59 709人浏览 独家记忆
摘要

从头一来二去阅读语法和命令说明,对于脚本小白来说比较枯燥,难以坚持,所以这里选择对一份完整的shell脚本代码来逐行逐段解读,希望可以渡一渡小白,帮助我们快速进入脚本的大门。 老司机要开车了: #!/bin/sh 用注

从头一来二去阅读语法和命令说明,对于脚本小白来说比较枯燥,难以坚持,所以这里选择对一份完整的shell脚本代码来逐行逐段解读,希望可以渡一渡小白,帮助我们快速进入脚本的大门。

老司机要开车了:

#!/bin/sh

用注释的形式说明文件打开类型,此处意指本脚本需要用 /bin/sh 打开。

#V1.0Addedhardwaretypedetection
#V1.1xxxx-xx-xx重构脚本
#V1.2xxxx-xx-xx将日志信息输出到U盘
#V1.3xxxx-xx-xx读取存储的检测结果值
#V1.4xxxx-xx-xx添加校验程序版本,U盘下有对应版本信息文件才校验

上面几行表示注释内容。单行注释,以#开始

UDiskMountDir=$(df|grep/mnt/sd|awk'END{print$NF}')

声明变量 UDiskMountDir 并赋值。

$()括号内填入命令并执行,最后返回输出到变量 UDiskMountDir。

df命令显示liinux系统上的文件系统磁盘使用情况统计。后边还可以带选项,执行更复杂的输出。命令后边加 '|' 表示将此命令的输出作为后边紧接着的命令的输入。

grep命令用于对文本按行搜索然后输出该行。英文全称 global search regular expression(RE) and print out the line。grep /mnt/sd 表示搜索输入信息里包含 /mnt/sd的一行,并输出该行。

awk命令用于对文本处理,END表示执行最后的运算或者打印最终的输出结果,这里用于打印输出,$NF 表示列数,print $NF 表示打印最后一个字段,各个字段默认以空格划分,可用选项 -F指定使用什么字符串来划分。

LogFile=${UDiskMountDir}/Debug.log

声明变量 LogFile 并以右边的内容赋值。将变量 UDiskMountDir 所代表的路径名与后边的字符串结合为新的文件名。一般命令中用到的文件名,要不是带相对路径的文件名,如 ./diretion/filename,就是带绝对路径的文件名,如 /root/diretion/filename

${UDiskMountDir} 表示引用变量 UDiskMountDir 的值。

AllCheckPassed=true

声明变量 AllCheckPassed 并赋值为true。

AddError()
{
AllCheckPassed=false
echo"-200">/tmp/VerCheckRes
}

声明函数 AddError,输入参数无需声明。

变量 AllCheckPassed 赋值为true。

echo命令用于输出字符串。echo "-200" > /tmp/VerCheckRes 将 -200 输出到文件 /tmp/VerCheckRes 并覆盖原有内容。如果将符号 > 换成 >> 则是将内容追加到最后位置。

AddRecord()
{
if[!-d"/userdata/recordsDir/"];then
mkdir-p/userdata/recordsDir/
fi
echo"$*">/userdata/recordsDir/test
sync
ADDDebugLog2UDisk$*
}

声明函数 AddRecord。

if 表示 if 语句的开始。if[]方括号内填判断条件,如为 true 则执行 then 后的语句,否则跳出 if 语句。fi表示 if 语句的结束。和 C 语言类似,if 语句也可以有 else 甚至 else if (shell 内应该写成 elif)。if/elif 和 then 如果不在同一行则可以省略符号 ;if [ ! -d "/userdata/recordsDir/" ] 判断目录 /userdata/recordsDir/ 是否存在,并对结果值取反(!)。

mkdir命令用于构建目录。带选项 -p表示构建路径下所有的目录。mkdir -p /userdata/recordsDir/创建目录 /userdata/recordsDir/, /userdata/ 如果不存在也会被构建。

echo "$*" > /userdata/recordsDir/test 将函数输入的所有参数都输出到文件 '/userdata/recordsDir/test' 并覆盖原有内容。'$*' 表示当前函数或者脚本的所有输入参数,由于在函数内引用,所以这里表示函数的所有输入参数。

sync命令用于数据同步。linux 系统中写入硬盘的数据往往会被先存放于 buffer 中,这样是为了效率起见,但是如果系统突然断电,那么数据就会丢失,这时可以调用 sync 将 buffer 中的数据同步到硬盘。

AddDebugLog2UDisk $* 调用函数 AddDebugLog2UDisk 并传入当前函数(AddRecord)的所有参数。

AddDebugLog2UDisk()
{
echo"$*">>"$LogFile"
sync
}

声明函数 AddDebugLog2UDisk。

echo "\$*" >>"$LogFile" 表示将函数的所有输入参数输出到变量 LogFile 表示的文件中,以追加的形式输入到文件末尾。

sync同步数据到硬盘。

#生成下/tmp/App/version.txt版本信息

注释内容

rm-f"$LogFile"

rm命令用于移除文件。选项 -f表示强制。rm -f "$LogFile"强制移除变量 LogFile 代表的文件,变量 LogFile 存储的是文件名,包括路径。

echo"0">/tmp/VerCheckRes

输出字符串 '0' 到文件 /tmp/VerCheckRes

sh/data/bin/run_nORMal.sh

在当前的环境中使用另一个shell来执行脚本文件 /data/bin/run_normal.sh,当前环境中变量的值可以在新脚本(/data/bin/run_normal.sh)中被使用(非引用,如果使用 source则变为引用),新脚本文件属性可以无执行权限。sh后边可以带选项 -n-x等,-n 用于进行shell脚本的语法检查,-x用于实现shell脚本的逐句跟踪调试并打印该行命令和状态等。

sleep2

阻塞当前进程,睡眠 2 秒,和 sleep 2s 同样效果。sleep 2h 表示睡眠 2 小时。

sh/tmp/App/kill.sh

执行脚本文件 /tmp/App/kill.sh

killallMachineChecknode

杀掉进程 MachineCheckNode,MachineCheckNode 为进程名。

lastSNScanResult=$(cat/userdata/recordsDir/scan)

读取文件 /userdata/recordsDir/scan 内容并赋值给变量 lastSNScanResult。

cat命令用于连接文件并输出内容到标准输出。

AddDebugLog2UDisk"lastsnscanresult:$lastSNScanResult"

调用函数 AddDebugLog2UDisk,并传递字符串 last sn scan result:$lastSNScanResult$lastSNScanResult 获取变量 lastSNScanResult 的值然后和前面的字符串结合成新的字符串。

#检查SN和markData
if[!-f/data/bin/sysData/sn];then
AddRecord"snmissing"
AddError
else
snContent=$(cat/data/bin/sysData/sn)
AddRecord"snis:$snContent"
snLen=$(cat/data/bin/sysData/sn|awk'{printlength($0)}')
if["$snLen"!="16"];then
AddRecord"snlengtherror$snLen"
AddError
fi
fi

if [ ! -f /data/bin/sysData/sn ] 判断文件 /data/bin/sysData/sn 是否是常规文件而且存在,'!' 表示对结果值取反。

如果文件 /data/bin/sysData/sn 找不到或者不是常规文件,则调用后边的语句块,直到 else 为止。调用函数 AddRecord(传入字符串 "sn missing") 和 AddError(无参数传入)。

否则,获取文件内容并赋值给变量 snContent,调用函数 AddRecord(输入 sn is:$snContent", 字符串其中会插入变量 snContent 的值);声明变量 snLen,赋值为命令 cat /data/bin/sysData/sn | awk '{print length($0)}'的执行结果;判断 snLen 是否不等于 16,是则调用函数 AddRecord 和 AddError。

$(cat /data/bin/sysData/sn | awk '{print length($0)}') 读取文件 /data/bin/sysData/sn 的内容,通过管道('|')输入到后一命令语句,awk 计算输入内容的第一字段的字符长度并输出。

if[!-f/data/bin/sysData/markData];then
AddRecord"markDatamissing"
AddError
fi

判断文件 /data/bin/sysData/markData 是否不存在,不存在则调用后边的语句(以 fi 为止)。

#检验版本信息
whileread-rline||[-n"${line}"];do
["$line"=""]&&continue
item_filename=$(echo"$line"|awk-F":"'{print$1}')
item_filemd5=$(echo"$line"|awk-F":"'{print$2}')
if[!-e"$item_filename"];then
AddRecord"$item_filenamemissing"
AddError
fi
acture_md5=$(md5sum"$item_filename"|awk'{print$1}')
if["$item_filemd5"="$acture_md5"];then
continue
else
AddRecord"$item_filename""md5diff!file:""$item_filemd5""acture:""$acture_md5"
AddError
fi
done</tmp/MachineDecDir/check_md5list

while read xxx; do...
done </filename循环读取文件名 filename 所指向的文件的内容,每读取一行存入 xxx 变量。read xxx为 while 语句的判断语句,判断语句和 do如果不在同一行,则 ;可省略,如:
while read xxxdo...
done </filename

read 后边的 -r 表示读取内容过程中对特殊字符有效,如 / (输入未结束需要换行继续输入的特殊符号),'/n' 等等。

[ -n "${line}" ] 判断 line 的内容不为空。而前边的 '||' 表示前一语句 read -r line 返回 false 才执行这个语句。

[ "$line" = "" ] && continue 表示如果 line 的内容为空则执行 continue;continue 命令用于跳过当前循环内容回去执行 while 判断语句。

 item_filename=$(echo "$line" | awk -F":" '{print $1}') 声明变量 item_filename 并以后边语句执行结果赋值。awk -F":" '{print $1}') 将输入的内容按照 : 来划分字段并输出第1个字段。awk -F":" '{print $2}') 则是将输入的内容按照 ':' 来划分字段并输出第2个字段。

if [ ! -e "$item_filename" ] 用于判断变量 item_filename 代表的文件名所指的文件是否不存在。!表示取反。if 判断的内容为 true 则执行 then 后边的语句,直到 fi 为止,否则跳过。

md5sum "$item_filename" 表示计算变量 item_filename 代表的文件名所指的文件的MD5值。

 | awk '{print $1}' 将前一语句的输出通过管道连接到后边的这个语句的输入,默认按照空格划分内容并输出第1个字段内容。

if [ "$item_filemd5" = "$acture_md5" ]; then 判断 item_filemd5 和 acture_md5 所代表的内容作为字符串是否一样,是则执行 then 后的语句。continue 指示程序执行流程直接回到执行 while 判断语句。else 后的语句块当 if 的判断条件不为 true 时执行。

#找到 U 盘路径
UDiskMountDir=$(df|grep/mnt/sd|awk'END{print$NF}')
#校验mcu程序版本,U盘下有mcuversion.txt才校验
UDiskMountDirfile="${UDiskMountDir}/SpecialDir/mcuversion.txt"
CurMcuVersionFile="/tmp/mcuversion.txt"
if[-f"$UDiskMountDirfile"];then
TargetMcuVersion=$(cat"$UDiskMountDirfile")
if[-f"$CurMcuVersionFile"];then
CurMcuVersion="$(cat"$CurMcuVersionFile")"
if["$TargetMcuVersion"!="$CurMcuVersion"];then
AddRecord"mcuversiondiffcur:$CurMcuVersiontarget:$TargetMcuVersion"
AddError
fi
else
AddRecord"$CurMcuVersionFilenotfound"
AddError
fi
fi

UDiskMountDirfile="${UDiskMountDir}/SpecialDir/mcuversion.txt" 声明变量 UDiskMountDirfile 并赋值为其后的内容,其后是将变量 UDiskMountDir 所代表的路径名与后边的字符串结合为新的文件名。

if 语句可以有多重嵌套,如上。

[ "$TargetMcuVersion" != "$CurMcuVersion" ] 判断 TargetMcuVersion 和 CurMcuVersion 所代表的内容是否不相等。

#写入检查结果
if[$AllCheckPassed="true"];then
AddRecord"Pass"
else
AddRecord"Fail"
fi

if [ $AllCheckPassed = "true" ]; then 判断 AllCheckPassed 的值是否等于字符串 "true",是则调用函数 AddRecord 并传入参数字符串 "Pass",否则调用函数 AddRecord 并传入参数字符串 "Fail"。

#启动checkall
/data/bin/Factory/MachineCheckNodeMachineImcomingTest

调用绝对路径下的程序 MachineCheckNode,并传入字符串参数 MachineImcomingTest。此种调用方式,要求程序文件 MachineCheckNode 具有可执行的权限属性x。想要查看指定路径下所有文件或某个文件的属性可以使用命令 ls -l查看,r表示可读,w表示可写,x表示可执行。

username@DESKTOP-ABCDEF:/mnt/d/username/work/temp$ ls -l
total 0
drwxrwxrwx 1 username username 4096 May 21 16:10 Udisk_IQC

这篇讲解到此为止,下期再见!

到此这篇关于linux shell脚本学习指南的文章就介绍到这了,更多相关linux shell脚本内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

--结束END--

本文标题: linux shell脚本学习指南

本文链接: https://www.lsjlt.com/news/34186.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • linux shell脚本学习指南
    从头一来二去阅读语法和命令说明,对于脚本小白来说比较枯燥,难以坚持,所以这里选择对一份完整的shell脚本代码来逐行逐段解读,希望可以渡一渡小白,帮助我们快速进入脚本的大门。 老司机...
    99+
    2024-04-02
  • Shell 脚本编写入门指南:从 Java 开始学起
    Shell 脚本是一种非常强大的工具,可以让你通过简单的命令快速地完成复杂的任务。它可以让你自动化很多繁琐的工作,例如文件操作、系统管理、进程管理等等。在这篇文章中,我们将从 Java 开始学习 Shell 脚本编写,帮助你更好地理解 S...
    99+
    2023-10-15
    django linux shell
  • linux中shell脚本指的是什么
    这篇“linux中shell脚本指的是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“linux中shell脚本指的是什么...
    99+
    2023-06-29
  • Python学习之shell脚本的使用详解
    目录一、sh是什么二、使用步骤1.安装2.使用示例3.使用sh执行命令4.关键字参数5.查找命令6.Baking参数一、sh是什么 SH是一个独特的子进程包装器,可将您的系统程序动态...
    99+
    2023-05-17
    Python使用shell脚本 Python shell脚本 Python shell
  • 如何学好shell脚本
    这篇文章主要介绍“如何学好shell脚本”,在日常操作中,相信很多人在如何学好shell脚本问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何学好shell脚本”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-09
  • python 脚本学习(一)
    日志读取脚本功能:用于读取某日志文件,可指定某个匹配条件,返回文本中匹配到的该行和前面的n行。此脚本可以接受3个参数,分别是文件对象、搜索的关键词、返回匹配的该行前面的行数。 #!/usr/local/python27/bin/python...
    99+
    2023-01-31
    脚本 python
  • 如何实现Linux Shell脚本数学运算
    本篇内容介绍了“如何实现Linux Shell脚本数学运算”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在任何一种编程语言中,算术运算都是必...
    99+
    2023-06-09
  • linux shell脚本详解
    shell 1. 基础 # shell的执行方式:- 路径方式 :必须赋予权限- source 立即执行,不需要权限- bash 执行新建一个文件,扩展名为sh(sh代表shell),输入一些代码:...
    99+
    2023-09-08
    linux bash 运维
  • Linux开发——shell脚本
    Linux开发 文章目录 Linux开发前言一、第一个shell脚本二、shell变量三、Shell 字符串单引号双引号获取字符串长度提取子字符串查找子字符串 四、shell数组定义数组读...
    99+
    2023-09-02
    linux bash 运维
  • MySQL5认证学习指南
    MySQL5认证学习指南: Detail:MySQL5认证学习指南[@more@] ...
    99+
    2024-04-02
  • Linux shell脚本怎么用
    这篇文章主要为大家展示了“Linux shell脚本怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux shell脚本怎么用”这篇文章吧。 Linux 脚本编写基础1 语法基本介绍1...
    99+
    2023-06-09
  • 简单易用的Python Linux脚本操作指南
    简单易用的Python Linux脚本操作指南在Linux环境下,Python脚本是一种异常强大且易于使用的工具。Python的简洁语法和丰富的库使得编写脚本变得快捷和高效。本文将为您介绍一些简单易用的Python Linux脚本操作,并提...
    99+
    2023-10-22
    Python Linux 脚本操作
  • Java和Unix Shell编程学习笔记:如何优化你的Shell脚本?
    Shell脚本是一种非常重要的编程语言,它可以帮助我们自动化执行一些重复性的任务,提高工作效率。但是,当脚本变得越来越复杂时,我们很容易陷入性能问题。本文将介绍一些优化Shell脚本的技巧,以提高其性能。 一、使用变量 Shell脚本中使...
    99+
    2023-09-12
    shell unix 学习笔记
  • PHP Linux脚本开发技巧与调试指南
    一、介绍随着Linux操作系统的普及和开发者对服务器端脚本的需求增加,使用PHP进行Linux脚本开发已经成为一种常见的选择。本文将介绍一些PHP Linux脚本开发的技巧和调试指南,并提供具体的代码示例,帮助读者更好地理解和应用。二、技巧...
    99+
    2023-10-21
    Linux PHP 脚本开发 调试指南
  • Swift 中 Opaque Types学习指南
    目录什么是Opaque Types如何使用为什么要使用可读性更强性能更好使用的限制总结什么是Opaque Types Opaque Types 是在 Swift5.7 新添加的一个...
    99+
    2023-05-14
    Swift Opaque Types Swift 学习指南
  • Linux学习之安装CentOS7-Mac版+避坑指南
    2021款MacBook M1 pro安装CentOS7虚拟机+避坑指南 前言一、准备VMware Fusion 13虚拟机1.下载安装2.激活3.启动VMware Fusion 13 ...
    99+
    2023-09-01
    linux 学习 macos
  • 4.《python自省指南》学习
    前言   前面几篇博客我都是通过python自省来分析代码并试图得出结论。当然,仅仅通过自省能解决的问题有限,但遇到问题还是不自主的去用这个功能,觉得对于认识代码的含义还是有一定帮助的。而这些自省的知识我都是从python自省指南中学习的...
    99+
    2023-01-30
    指南 python
  • Swift 中的 RegexBuilder学习指南
    目录前言Regex 字面量RegexBuilder - 像写代码一样写正则RegexRepetitionBehaviorFoundation 的支持总结前言 在我们日常的项目开发中...
    99+
    2023-05-14
    Swift RegexBuilder Swift 学习
  • PHP 学习笔记:如何在 UNIX Shell 中运行 PHP 脚本?
    PHP 是一种广泛使用的服务器端脚本语言,它可以用来编写动态网页、命令行脚本等。在 UNIX 系统中,我们可以使用 Shell 来运行 PHP 脚本,本文将介绍如何在 UNIX Shell 中运行 PHP 脚本。 安装 PHP 在开始...
    99+
    2023-08-07
    学习笔记 unix shell
  • linux如何编写shell脚本
    编写Linux的shell脚本可以使用任何文本编辑器,如vi、nano、gedit等。以下是编写shell脚本的一般步骤:1. 打开...
    99+
    2023-09-15
    linux shell
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作