如何改进你的脚本程序
你是否曾经查看过某个软件发行方提供的安装用的脚本script程序?为了能够适应不同用户的系统配置,顺利完成安装,这些脚本程序经常包含很多函数和逻辑分支。多年来,我积累了一些改进脚本程序的一些技巧,这里分享几个,希望能对朋友们也有用。这里列出一组短脚本示例,展示给大家做脚本样本。 |
初步尝试
我尝试写一个脚本程序时,原始程序往往就是一组命令行,通常就是调用标准命令完成诸如更新网页内容之类的工作,这样可以节省时间。其中一个类似的工作是解压文件到 Apache 网站服务器的主目录里,我的最初脚本程序大概是下面这样:
cp january_schedule.tar.gz /usr/apache/home/calendar/ cd /usr/apache/home/calendar/ tar zvxf january_schedule.tar.gz
这帮我节省了时间,也减少了键入多条命令操作。时日久了,我掌握了另外的技巧,可以用 Bash 脚本程序完成更难的一些工作,比如说创建软件安装包、安装软件、备份文件系统等工作。
1、条件分支结构
和众多其他编程语言一样,脚本程序的条件分支结构同样是强大的常用技能。条件分支结构赋予了计算机程序逻辑能力,我的很多实例都是基于条件逻辑分支。
基本的条件分支结构就是 if 条件分支结构。通过判定是否满足特定条件,可以控制程序选择执行相应的脚本命令段。比如说,想要判断系统是否安装了 Java ,可以通过判断系统有没有一个 Java 库目录;如果找到这个目录,就把这个目录路径添加到可运行程序路径,也就可以调用 Java 库应用了。
if [ -d "$JAVA_HOME/bin" ] ; then PATH="$JAVA_HOME/bin:$PATH"
2、限定运行权限
你或许想只允许特定的用户才能执行某个脚本程序。除了 Linux 的权限许可管理,比如对用户和用户组设定权限、通过 SELinux 设定此类的保护权限等,你还可以在脚本里设置逻辑判断来设置执行权限。类似的情况可能是,你需要确保只有网站程序的所有者才能执行相应的网站初始化操作脚本。甚至你可以限定只有 root 用户才能执行某个脚本。这个可以通过在脚本程序里设置逻辑判断实现,Linux 提供的几个环境变量可以帮忙。其中一个是保存用户名称的变量 $USER, 另一个是保存用户识别码的变量 $UID 。在脚本程序里,执行用户的 UID 值就保存在 $UID 变量里。
用户名判别
第一个例子里,我在一个带有几个应用服务器实例的多用户环境里指定只有用户 jboss1 可以执行脚本程序。条件 if 语句主要是判断,“要求执行这个脚本程序的用户不是 jboss1 吗?”当此条件为真时,就会调用第一个 echo 语句,接着是 exit 1,即退出这个脚本程序。
if [ "$USER" != 'jboss1' ]; then echo "Sorry, this script must be run as JBOSS1!" exit 1 fi echo "continue script"
根用户判别
接下来的例子是要求只有根用户才能执行脚本程序。根用户的用户识别码(UID)是 0,设置的条件判断采用大于操作符(-gt),所有 UID 值大于 0 的用户都被禁止执行该脚本程序。
if [ "$UID" -gt 0 ]; then echo "Sorry, this script must be run as ROOT!" exit 1 fi echo "continue script"
3、带参数执行程序
可执行程序可以附带参数作为执行选项,命令行脚本程序也是一样,下面给出几个例子。在这之前,我想告诉你,能写出好的程序并不只是写出我们想要它执行什么的程序,程序还需要不执行我们不要它执行的操作。如果运行程序时没有提供参数造成程序缺少足够信息,我愿意脚本程序不要做任何破坏性的操作。因而,程序的第一步就是确认命令行是否提供了参数,判定的条件就是参数数量 $# 是否为 0 ,如果是(意味着没有提供参数),就直接终止脚本程序并退出操作。
if [ $# -eq 0 ]; then echo "No arguments provided" exit 1 fi echo "arguments found: $#"
多个运行参数
可以传递给脚本程序的参数不止一个。脚本使用内部变量指代这些参数,内部变量名用非负整数递增标识,也就是 $1、$2、$3 等等递增。我只是扩展前面的程序,并在下面一行输出显示用户提供的前三个参数。显然,要针对所有的每个参数有对应的响应需要更多的逻辑判断,这里的例子只是简单展示参数的使用。
echo $1 $2 $3
我们在讨论这些参数变量名,你或许有个疑问,“参数变量名怎么跳过了 $0,(而直接从$1 开始)?”
是的,是这样,这是有原因的。变量名 $0 确实存在,也非常有用,它储存的是被执行的脚本程序的名称。
echo $0
程序执行过程中有一个变量名指代程序名称,很重要的一个原因是,可以在生成的日志文件名称里包含程序名称,最简单的方式应该是调用一个 echo 语句。
echo test >> $0.log
当然,你或许要增加一些代码,确保这个日志文件存放在你希望的路径,日志名称包含你认为有用的信息。
4、交互输入
脚本程序的另一个好用的特性是可以在执行过程中接受输入,最简单的情况是让用户可以输入一些信息。
echo "enter a word please:" read word echo $word
这样也可以让用户在程序执行中作出选择。
read -p "Install Software ?? [Y/n]: " answ if [ "$answ" == 'n' ]; then exit 1 fi echo "Installation starting..."
5、出错退出执行
几年前,我写了个脚本,想在自己的电脑上安装最新版本的 Java 开发工具包(JDK)。这个脚本把 JDK 文件解压到指定目录,创建更新一些符号链接,再做一下设置告诉系统使用这个最新的版本。如果解压过程出现错误,在执行后面的操作就会使整个系统上的 Java 破坏不能使用。因而,这种情况下需要终止程序。如果解压过程没有成功,就不应该再继续进行之后的更新操作。下面语句段可以完成这个功能。
tar kxzmf jdk-8u221-linux-x64.tar.gz -C /jdk --checkpoint=.500; ec=$? if [ $ec -ne 0 ]; then echo "Installation failed - exiting." exit 1 fi
下面的单行语句可以给你快速展示一下变量 $? 的用法。
ls T; ec=$?; echo $ec
先用 touch T 命令创建一个文件名为 T 的文件,然后执行这个单行命令,变量 ec 的值会是 0。然后,用 rm T 命令删除文件,再执行该单行命令,变量 ec 的值会是 2,因为文件 T 不存在,命令 ls 找不到指定文件报错。
在逻辑条件里利用这个出错标识,参照前文我使用的条件判断,可以使脚本文件按需完成设定操作。
结语
要完成复杂的功能,或许我们觉得应该使用诸如 Python、C 或 Java 这类的高级编程语言,然而并不尽然,脚本编程语言也很强大,可以完成类似任务。要充分发挥脚本的作用,有很多需要学习的,希望这里的几个例子能让你意识到脚本编程的强大。
如何改进你的脚本程序相关推荐
- 制作显示欢迎信息的脚本程序
终端程序恐怕是Linux用户使用最为频繁的了.我的Debian系统启动后便是直接进入的终端界面.为了在每次登录时或者是在X视窗环境下打开终端程序时显示一些欢迎信息,比如当前的日期.名人警句等,从而可以 ...
- 怎样在javascript函数中将变量传递给服务端脚本程序?
怎样在javascript函数中将变量传递给服务端脚本程序? (有朋友问上述问题, 愿把结论分享给大家). 摘 要: 服务器端脚本运行时, 它只会解释执行<% %>或<?php ...
- 调试JavaScript/VB Script脚本程序(IE篇)
JavaScript/VB Script脚本程序一般有两种执行方式,一种是嵌入在宿主程序里面执行,比如在IE浏览器里面执行:另外一种,在资源管理器里面双击执行(虽然还是通过另外一个程序解释执行,但是给 ...
- Linux在后台运行python程序、脚本程序、可执行程序等,关闭终端仍可保持程序运行
欢迎大家关注笔者,你的关注是我持续更博的最大动力 原创文章,转载告知,盗版必究 Linux在后台运行python程序.脚本程序.可执行程序等,关闭终端仍可保持程序运行 文章目录: 1 为什么需要后台运 ...
- windows的.bat批处理文件运行Python脚本程序
windows的.bat批处理文件运行Python脚本程序 文章目录: 一.如何创建 `.bat` 批处理文件 二.创建执行的Python脚本程序 一.如何创建 .bat 批处理文件 创建.bat 批 ...
- mcgs组态软件中字体如果从左到右变化_昆仑通态专题(十一):MCGS嵌入式组态软件的脚本程序...
脚本程序是MCGS嵌入式组态软件中的一种 内置编程语言引擎.当某些控制和计算任务 通过常规组态方法难以实现时,通过脚本语 言可以解决其常规组态方法难以解决的问题.本章介绍MCGS嵌入版组态软件的脚本语 ...
- 软件测试-PR录制脚本程序的时候出现license invalid,error code=-13或者-24的错误
如果你在使用PR录制脚本程序的时候出现license invalid,error code=-13或者-24的错误 那么证明你没有许可证,需要联络泽众公司那边,申请许可证 有关操作见下: http:/ ...
- JavaScript/VBScript脚本程序调试(Wscript篇)
在实际工作中,我发现程序员对脚本抱怨最多的就是脚本程序很难调试这个缺点,特别是调试.vbs等WSH程序的时候,总是: 1. 在资源管理器里面双击一个.vbs文件. 2. 程序里面发生了一个错误,例如异 ...
- 我的一个学生在运维工作中写的自动日志清理脚本程序
本文是我的一个学生在运维工作中写的自动日志清理脚本程序,我这里不评价该shell脚本写的好与坏,只是发出来,和大家做一个分享,如果能给大家带来一点点思路上的参考就够了. 自动日志清理脚本程序 #!/b ...
最新文章
- golang并发编程goroutine+channel(一)
- Twitter Storm常见模式
- 什么是OOA/OOD
- javascript原型对象、原型链、构造函数
- 为X Windows添加TrueType字体
- 解决:RabbitMQ 连接报错:amqp.AmqpConnectException: java.net.ConnectException: Connection refused: connect
- iPhone 5今日大限已至!不升级全部变砖
- oracle 11g rman catalog,Oracle 11g RMAN复制数据库的测试
- CentOS 服务器搭建 mediawiki
- 程序之间耦合以及解耦问题探究
- 百度墨卡托经纬度互转工具类
- python学习笔记11 百度识图
- java计算机毕业设计计算机课程在线培训学习管理系统MyBatis+系统+LW文档+源码+调试部署
- Kubernetes系列教程(三)---纯三层网络方案
- 实用工具网站(搜索/PPT/图片操作...)
- 高斯消去法的python实现
- 【车牌识别】基于matlab GUI阈值分割车牌识别(带面板)【含Matlab源码 721期】
- 2020年11月9日
- 从了解Linux开始
- 与声网面对面!声网Agora开发者吐槽大会招募中
热门文章
- 一首凉凉送给这些学校硕博生!本学期不必返校!这些高校已经发布通知了
- 第一批 90 后30 岁了!那些 30 岁前就成博导的人都怎样了...
- 卧槽!看不懂这些动图,你不配做个程序员
- 15个相见恨晚的 Linux 神器,你可能一个都没见过
- 12个深度学习面试问题
- 步步为营 .NET 设计模式学习笔记 六、Adapter(适配器模式)
- Swift 面向对象
- 从一个死锁看mysql innodb的锁机制
- ConcurrentDictionary线程不安全么,你难道没疑惑,你难道弄懂了么?
- Java性能调优、LinkedIn容器部署、阿里移动性能调优——首届APMCon精彩演讲先睹为快...