我的编程空间,编程开发者的网络收藏夹
学习永远不晚

linux shell脚本学习指南

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

linux shell脚本学习指南

从头一来二去阅读语法和命令说明,对于脚本小白来说比较枯燥,难以坚持,所以这里选择对一份完整的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脚本内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

linux shell脚本学习指南

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

下载Word文档

猜你喜欢

Shell脚本学习指南之文本处理工具

4.1 排序文本 4.1.1 行的排序未提供命令行选项时,整个记录会根据当前locale所定义的次序排序。在传统的C locale中,也就是ASCII顺序。 4.1.2 以字段排序-k选项的后面接着的是一个字段编号,或者是一对数字。每个编号
2022-06-04

shell脚本学习指南[三](Arnold Robbins & Nelson H.F. Beebe著)

今天木有冷笑话,只有一个噩耗。噩耗是:今天木有冷笑话!!!不要总想着冷笑话嘛,有点追求,听毛主席的话:好好学习,天天向上! 第七章输入输出、文件与命令执行 学C的应该了解标准输入输出和错误输出吧?感觉总打很多字进度太慢,所以一直在省略类似C
2022-06-04

shell脚本学习指南[一](Arnold Robbins & Nelson H.F. Beebe著)

第一章略过,下边从第二章开始,大家懂得。ps:这里发生了一件非常当我蛋疼的事情,非常!已经码文章码到第四章了,悲剧的按错浏览器按钮刷新掉,怎么也找不回来之前写的东西了。想死!算了,复习一边吧。以下全文均属自己总结书写,有错误的地方也未必是书
2022-06-04

shell脚本学习指南[二](Arnold Robbins & Nelson H.F. Beebe著)

该进入第四章了,刚才看到一个帖子标题:我空有一身泡妞的好本领,但可惜自己是个妞。汗~这个。。。音乐无国界嘛,这个不应该也没性别界么? 第四章文本处理工具 书中先说明了以下排序的规则,数值的就不用说了,该大就大该小就小,但是字符型很多时候是区
2022-06-04

shell脚本学习指南[六](Arnold Robbins & Nelson H.F. Beebe著)

学shell到现在了,一直以为自己不会犯一个大家常说的非常二的问题,结果这本书最后的时候犯了个十分2的事,晚节不保啊!!!我在测试文件路径下除了通配符*和?外还能用啥正则那样的东西,结果就在$HOME下执行了rm .* 。。。好吧,蛋疼了一
2022-06-04

shell脚本学习指南[四](Arnold Robbins & Nelson H.F. Beebe著)

回忆起一件事情:之前用linux寻找中文输入法的时候,在百度输入了fcitx,然后结果上边有个,您要找的是不是: 讽刺腾讯 。本来一直记不住这个输入法名字,不过以后哥就记住这个输入法的名字是怎么拼了,感谢百度。 第九章awk的惊人表现 aw
2022-06-04

shell脚本学习指南[五](Arnold Robbins & Nelson H.F. Beebe著)

作者告诉我们:到目前为止基础已经搞定,可以将前边所学结合shell变成进军中等难度的任务了。激动的要哭了,终于看到本书结束的曙光了 T T 。码字比码代码还辛苦。不过令人兴奋的是立刻就学以致用了,花了一天半的时间处理了一个3.8G的服务器日
2022-06-04

Shell脚本学习指南之查找与替换介绍

3.1 查找文本grep:使用POSIX定义的基本正则表达式(BRE)。egrep:使用扩展正则表达式(ERE)。fgrep:快速grep。使用优化的算法,匹配固定字符串而非正则表达式。 1992 POSIX标准将这三个改版整合成一个gre
2022-06-04

linux shell脚本基础知识学习

Shell脚本: 1、#! 指定脚本执行的shell2、# 注释 3、命令或语法结构echo "输入内容"echo 输出空行执行: 1、shell 脚本 sh example2、给shell脚本执行权限 chmod u+x exa
2022-06-04

Linux shell脚本全面学习入门

1. Linux 脚本编写基础 1.1 语法基本介绍 1.1.1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh来执行
2022-06-04

shell脚本学习与总结

1.shell 脚本是区分小写的2.Unix特殊字符有: ( ; $ ? & * () [] ` ‘ “ + 使用其时要进行转义()3.Shell的注释以#开头4.函数的定义Function fuction_name(){Command t
2022-06-04

Bash Shell脚本学习小结

1.字符截断:如果是一般路径的字符截断可以用basename和dirname这两个工具:basename可以从一个文件路径中截一个文件名 例如:$ basename /home/file.tarfile.tar dirname可以从一个文件
2022-06-04

Bash Shell 脚本新手指南(二)

本篇将就 Bash 脚本一些更独特的方面进行深入探讨。我们会用到一些 上篇 中已经熟悉的命令(如果遇到新命令,会给出讲解),进而涵盖一些标准输出、标准输入、标准错误、“管道”和数据重定向的相关知识。

Bash Shell 脚本新手指南(三)

这篇文章将来学习一些知识点,这些将使你为持续的个人发展做好准备。它将涉及到函数、用 if/elif 语句进行比较,并以研究 while 循环作为结尾。

Bash Shell 脚本新手指南(一)

如标题所示,本文将涵盖面向初学者的 Bash Shell 脚本知识。虽然本文没有回顾 Bash 的历史,但是有很多资源能够便于读者了解相关内容。我们会从了解一些非常基本的概念开始,然后再将相关知识综合起来。

linux shell脚本学习xargs命令使用详解

例如,下面的命令: rm `find /path -type f`如果path目录下文件过多就会因为“参数列表过长”而报错无法执行。但改用xargs以后,问题即获解决。 find /path -type f -print0 | xargs
2022-06-04

linux shell脚本学习录制与回放终端会话

amosli@amosli-pc:~/learn$ script -t 2> timing.log -a output.session#开始录制Script started, file is output.sessionamosli@amo
2022-06-04

编程热搜

目录