一文读懂 shell 脚本编程
一、shell 脚本基础知识
shell脚本是一个文件,里面存放的是特定格式的指令,系统可以使用脚本解析器翻译或解析指令并执行(无需编译)。shell脚本的本质是 shell命令的有序集合
shell脚本编程的基本过程分为三步:
- 建立 shell文件:包含任意多行操作系统命令或shell命令的文本文件
vi test.sh
- 赋予 shell文件执行权限:用 chmod命令修改权限
chmod 740 test.sh
- 执行 shell文件:直接在命令行上调用shell程序
./test.sh
二、shell 变量
shell允许用户建立变量存储数据,但不支持数据类型(整型、字符、浮点型), 任何赋给变量的值都被解释为一串字符。
定义shell变量名时,首个字符必须为字母(a-z,A-Z),不能以数字开头,中间不能有空格,可以使用下划线(_),不能使用(-),也不能使用标点符号等。shell变量分为三种,分别是系统变量、环境变量和用户变量
- 用户变量:用户自定义变量,通常使用全大写定义变量名,方便识别;在变量前加==$ ==调用变量;从右向左赋值;unset命令可删除变量的赋值
COUNT=1 #通常使用全大写定义变量名,方便识别
echo $HOME #在变量前加 $ 调用变量
# Linux Shell/bash从右向左赋值
Y=y
X=$Y
echo $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 #主机名
三、shell 功能语句
shell脚本程序由单条或多条 shell语句构成。 shell语句包括三类:说明性语句、功能性语句和结构性语句
- 说明性语句:即注释行,以#号开始到该行结束,不被解释执行
#! /bin/sh
# 以上是告诉OS用哪种类型的shell来解释执行该程序
- 功能性语句:任意的shell命令、用户程序或其它shell程序。以 read 命令和 expr 命令为例
read 命令:read从标准输入读入一行, 并赋值给后面的变量。若标准输入无数据, 则程序在此停留等侯, 直到数据到来或被终止运行
read var #把读入的数据全部赋给var
read var1 var2 var3 #把读入行中的第一个词赋给var1,第二个赋给var2,其余所有赋给var3
expr 命令:用于简单的整数运算,包括加(+)、减(-)、乘(*)、整除(/)和求模(%)等操作
expr 12 + 5 \* 3 #反斜线\去掉*号的元字符含义
27
expr 3 - 8 / 2
-1
#####
num=9
sum=`expr $num \* 6` #反撇号`引用命令的运行结果
echo $sum
54
- 结构性语句:根据程序的运行状态、输入数据、变量的取值、控制信号以及运行时间等因素来控制程序的运行流程。主要包括条件测试语句(两路分支)、多路分支语句、循环语句、循环控制语句和后台执行语句等
测试性语句:test语句可测试字符串、整数和文件属性
test "$answer" = "yes" #变量answer的值是否为字符串yes
test $num –eq 18 #变量num的值是否为整数18
test -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是否大于b
a -ge b #测试a是否大于等于b
a -lt b #测试a是否小于b
a -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文件是否存在且其长度不为0
f1 -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......
done
while [condition]
do......
done
循环控制语句
break #终止执行所有循环
continue #终止该次循环,进行下次循环
四、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=0for n in $@do((sum+=n))donereturn $sum
}
#调用函数并传递参数
get_sum 10 2 5 7 9 12 50
echo $?
一文读懂 shell 脚本编程相关推荐
- 一文读懂shell命令
一文懂shell命令 01.shell解释器使用优先级别 02.shell脚本运行方式 03.变量基本定义 04.特殊的变量:命令变量 05.变量取值 06.删除一个变量 07.环境变量(全局变量) ...
- linux 脚本$字符,一文看懂shell脚本中$0 $1 $# $@ $* $? $$ 的各种符号意义
概述 shell中有两类字符,一类是普通字符,在Shell中除了本身的字面意思外没有其他特殊意义,即普通纯文本:另一类即元字符,是Shell的保留字符,在Shell中有着特殊的含义. 今天主要介绍一下 ...
- 一文读懂 Shell 中各种括号的作用
[欢迎关注微信公众号:厦门微思网络] 微思网络(官网):https://www.xmws.cn/ 一.小括号,圆括号() 1.单小括号 () ①命令组.括号中的命令将会新开一个子shell顺序执行,所 ...
- VisionPro之脚本(一文读懂VisionPro脚本原理与使用方法)
文章目录 一.脚本简介 二.脚本类与方法 三.脚本使用案例 四.脚本进阶 一.脚本简介 1.1 VisionPro项目组成简介 在介绍脚本之前先简单介绍一下VisionPro开发环境(QuickBui ...
- 一文读懂什么是编程!
编程,俗称写代码,或者写程序,是指编写计算机程序员,让计算机按照编程者的思维去执行一系列指令的行为. 编程可以做什么? 一.编程可以控制小到计算机.手机.智能手表.智能汽车.智能家电,大到航天飞机.登 ...
- 网络编程之一文读懂什么是IPv6
网络编程之一文读懂什么是IPv6 复习一下什么是IPv4? IPv6又是什么? 为什么要使用IPv6? IPv6会带给我们什么? IPv6的优点这么多,为什么之前普及却这么慢? NAT这类技术,让IP ...
- 网络编程懒人入门(十一):一文读懂什么是IPv6
本文同时发布于"即时通讯技术圈"公众号,链接是:https://mp.weixin.qq.com/s/cS5xB2DrjF52rmz6EGVJ6A. 本文参考了公众号鲜枣课堂的&q ...
- 一文读懂大数据平台——写给大数据开发初学者的话!
一文读懂大数据平台--写给大数据开发初学者的话! 文|miao君 导读: 第一章:初识Hadoop 第二章:更高效的WordCount 第三章:把别处的数据搞到Hadoop上 第四章:把Hado ...
- 扫盲 Linux&UNIX 命令行——从“电传打字机”聊到“shell 脚本编程”
扫盲 Linux&UNIX 命令行--从"电传打字机"聊到"shell 脚本编程" 本文目标读者 虽然本文的标题号称是[扫盲],但俺相信:即使是一些 P ...
最新文章
- Linux之因BASH造成的键盘错误和环境问题
- php代码 2012057
- Windows中现在有独立的Linux文件夹系统
- VS2017新建视图中文乱码解决办法
- 文思海辉口碑很差_文思海辉·金融打造全自动、100%话务覆盖的智能质检系统
- 四、Delphi 2009 泛型容器单元(Generics.Collections)[3]: TStackT
- Face Alignment by 3000 FPS系列学习总结(一)
- 三星副会长李在镕启程赴美
- GridView页脚汇总(统计)行的方法(.net 2.0)
- Linux系统管理(7)——Linux单用户模式详解 及应用场景
- linux中docker容器与宿主系统之间文件拷贝
- CIO:IT优化刻不容缓
- LAMP使开放源代码软件安全性提高
- 微信模板消息发送实例
- 2018年11月酷云大数据月度报告
- Django之wagtail安装及配置
- 卡特彼勒牵手CBA联赛助力中国篮球发展
- 《浣溪沙·一曲新词酒一杯》 晏殊
- PMP分享|不在挣扎中蜕变,就在安逸中消亡
- 我国网络营销发展的现状、障碍与对策