1. shell脚本基础知识
shell脚本是一个文件,里面存放的是特定格式的指令,系统可以使用脚本解析器翻译或解析指令并执行(无需编译),shell脚本的本质是shell命令的有序集合
shell脚本编程的基本过程分为三步:
建立shell文件:包含任意多行操作系统命令或shell命令的文本文件
vi test.sh赋予shell文件执行权限:用chmod命令修改权限
chmod 740 test.sh执行shell文件:直接在命令行上调用shell程序
./test.sh2. shell变量
shell允许用户建立变量存储数据,但不支持数据类型(整型、字符、浮点型), 任何赋给变量的值都被解释为一串字符。
定义shell变量名时,首个字符必须为字母,不能以数字开头,中间不能有空格,可以使用下划线,不能使用中横线及标点符号等。 shell变量分为系统变量、环境变量和用户变量三种:
用户变量:用户自定义变量,通常使用全大写定义变量名,方便识别; 在变量前加 $ 调用变量; 从右向左赋值; unset命令可删除变量的赋值
count=1 #通常使用全大写定义变量名,方便识别echo $home #在变量前加 $ 调用变量# linux shell/bash从右向左赋值y=yx=$yecho $x y #使用unset命令删除变量的赋值 z=hello echo $z hello unset z echo $z系统变量:用于对参数判断和命令返回值判断时使用
$0 #当前脚本的名称$n #传递给脚本或函数的第n个参数,n=1,2,…9$# #传递给脚本或函数的参数个数$* #传递给脚本或函数的所有参数:“$1,$2,……$9” 整体传递$@ #传递给脚本或函数的所有参数:“$1”,“$2”,……“$9” 分开传递$? #命令或程序执行完后的状态,返回0表示执行成功$$ #当前脚本程序的pid号环境变量:在程序运行时需要设置
path #shell搜索路径,以冒号为分割home #/etc/passwd文件中列出的用户主目录 shell #当前shell类型user #当前用户名id #当前用户id信息pwd #当前所在路径term #当前终端类型hostname #当前主机名;ps1 #定义主机命令提示符histsize #历史命令大小,可通过histtimeformat变量设置命令执行时间random #随机生成一个0至32767的整数hostname #主机名3. shell功能语句
shell脚本程序由单条或多条shell语句构成。 shell语句包括三类:说明性语句、功能性语句和结构性语句
说明性语句:即注释行,以 # 号开始到该行结束,不被解释执行
#! /bin/sh# 以上是告诉os用哪种类型的shell来解释执行该程序功能性语句:任意的shell命令、用户程序或其它shell程序。 以read命令和expr命令为例
read命令:read从标准输入读入一行, 并赋值给后面的变量。 若标准输入无数据, 则程序在此停留等侯, 直到数据到来或被终止运行
read var #把读入的数据全部赋给varread var1 var2 var3 #把读入行中的第一个词赋给var1,第二个赋给var2,其余所有赋给var3expr命令:用于简单的整数运算,包括加(+)、减(-)、乘(*)、整除(/)和求模(%)等操作
expr 12 + 5 \\* 3 #反斜线\\去掉*号的元字符含义27expr 3 - 8 / 2-1#####num=9sum=`expr $num \\* 6` #反撇号`引用命令的运行结果echo $sum54结构性语句:根据程序的运行状态、输入数据、变量的取值、控制信号以及运行时间等因素来控制程序的运行流程。 主要包括条件测试语句、多路分支语句、循环语句、循环控制语句和后台执行语句等
测试语句:test语句可测试字符串、整数和文件属性
test $answer = yes #变量answer的值是否为字符串yestest $num –eq 18 #变量num的值是否为整数18test -d tmp #测试tmp是否为一个目录名##### 字符串测试 ##### s1 = s2 #测试两个字符串的内容是否完全一样s1 != s2 #测试两个字符串的内容是否有差异-z s1 #测试s1字符串的长度是否为0-n s1 #测试s1字符串的长度是否不为0##### 整数测试 ##### a -eq b #测试a与b是否相等a -ne b #测试a与b是否不相等a -gt b #测试a是否大于ba -ge b #测试a是否大于等于ba -lt b #测试a是否小于ba -le b #测试a是否小于等于b##### 文件测试 ##### -d name #测试name是否为一个目录-e name #测试一个文件是否存在-f name #测试name是否为普通文件-l name #测试name是否为符号链接-r name #测试name文件是否存在且为可读-w name #测试name文件是否存在且为可写-x name #测试name文件是否存在且为可执行-s name #测试name文件是否存在且其长度不为0f1 -nt f2 #测试文件f1是否比文件f2更新f1 -ot f2 #测试文件f1是否比文件f2更旧条件语句
if [condition1]; then ...elif [condition2]; then ...else ...fi多路分支语句
case $variable in case1) ...... ;; case2) ...... ;; case3) ...... ;; *) ...... ;;esac循环语句
for var in con1 con2 con3 ...do ......donewhile [condition]do ......done循环控制语句
break #终止执行所有循环continue #终止该次循环,进行下次循环4. shell函数
把一个功能封装起来,使用时直接调用函数名,模块化,代码可读性强,扩展性方便。 shell中有两种定义函数的语法格式:
# 若写了function,可以省略函数名后的括号function fname { ......}# 不写function时,函数名后需要加括号fname() { ......}和其他编程语言不同的是,shell函数在定义时不能指明参数,但在调用时却可以传递参数,并且给它传递什么参数它就接收什么参数。 当然调用函数时也可以不传递参数。 函数调用方法如下:
# 不传递参数时,直接给出函数名即可fname# 如果要传递参数,多个参数之间以空格分开fname param1 param2 param3如下函数调用实例1:运行脚本后,输出www.baidu.com
#!/bin/bash#定义函数function url { echo www.baidu.com}#调用函数url如下函数调用实例2:运行脚本后,输出传参值之和
#!/bin/bash#定义函数:获取参数的和function get_sum() { local sum=0 for n in $@ do ((sum+=n)) done return $sum}#调用函数并传递参数get_sum 10 2 5 7 9 12 50echo $?
赛普拉斯发布S6BP系列PMIC汽车安全应用使用指南
瑞萨购买FastLogic组合授权许可证
VOC在线检测仪是全新打造的一款VOCs气体监测系统
电磁流量计的具体功能及技术参数
多晶硅价格跌至冰点 九成企业将遭淘汰
shell脚本基础知识
水声测距实施方案
汽车零部件行业概况
LG显示连续5年引领10英寸以上高端汽车显示器市场
二叉树的前序遍历非递归实现
三星计划基于GAA技术批量生产业界首批半导体
人工智能融入敏捷项目会有哪一些好处
谷歌重磅新作PaLI-3:视觉语言新模型!更小、更快、更强
物联网企业纵行科技当选为全国工商联物联网委员会成员
MOS管的开关特性
红魔5G游戏手机跑分曝光,144Hz电竞屏加持大电池畅快游戏
科学智能除甲醛的好方法
火爆预售中 | 普渡科技推出配送迎宾二合一机器人“葫芦”
智能工业无线ANDON呼叫安灯报修系统厂家最新研究成果
泰景信息科技宣布推出第三代模拟移动电视接收器