Shell 脚本基础学习 (四)
现在我们来讨论编写一个脚本的一般步骤。任何优秀的脚本都应该具有帮助和输入参数。并且写一个伪脚本(framework.sh),该脚本包含了大多数脚本都需要的框架结构,是一个非常不错的主意。这时候,在写一个新的脚本时我们只需要执行一下copy命令:
cp framework.sh myscript
然后再插入自己的函数。
让我们再看个例子:
二进制到十进制的转换
脚本 b2d 将二进制数 (比如 1101) 转换为相应的十进制数。这也是一个用expr命令进行数学运算的例子:
1 #!/bin/sh 2 3 # vim: set sw=4 ts=4 et: 4 5 help() 6 7 { 8 9 cat < 10 11 b2h -- convert binary to decimal 12 13 USAGE: b2h [-h] binarynum 14 15 OPTIONS: -h help text 16 17 EXAMPLE: b2h 111010 18 19 will return 58 20 21 HELP 22 23 exit 0 24 25 } 26 27 error() 28 29 { 30 31 # print an error and exit 32 33 echo "$1" 34 35 exit 1 36 37 } 38 39 lastchar() 40 41 { 42 43 # return the last character of a string in $rval 44 45 if [ -z "$1" ]; then 46 47 # empty string 48 49 rval="" 50 51 return 52 53 fi 54 55 # wc puts some space behind the output this is why we need sed: 56 57 numofchar=`echo -n "$1" | wc -c | sed 's/ //g' ` 58 59 # now cut out the last char 60 61 rval=`echo -n "$1" | cut -b $numofchar` 62 63 } 64 65 chop() 66 67 { 68 69 # remove the last character in string and return it in $rval 70 71 if [ -z "$1" ]; then 72 73 # empty string 74 75 rval="" 76 77 return 78 79 fi 80 81 # wc puts some space behind the output this is why we need sed: 82 83 numofchar=`echo -n "$1" | wc -c | sed 's/ //g' ` 84 85 if [ "$numofchar" = "1" ]; then 86 87 # only one char in string 88 89 rval="" 90 91 return 92 93 fi 94 95 numofcharminus1=`expr $numofchar "-" 1` 96 97 # now cut all but the last char: 98 99 rval=`echo -n "$1" | cut -b 0-${numofcharminus1}` 100 101 } 102 103 while [ -n "$1" ]; do 104 105 case $1 in 106 107 -h) help;shift 1;; # function help is called 108 109 --) shift;break;; # end of options 110 111 -*) error "error: no such option $1. -h for help";; 112 113 *) break;; 114 115 esac 116 117 done 118 119 # The main program 120 121 sum=0 122 123 weight=1 124 125 # one arg must be given: 126 127 [ -z "$1" ] && help 128 129 binnum="$1" 130 131 binnumorig="$1" 132 133 while [ -n "$binnum" ]; do 134 135 lastchar "$binnum" 136 137 if [ "$rval" = "1" ]; then 138 139 sum=`expr "$weight" "+" "$sum"` 140 141 fi 142 143 # remove the last position in $binnum 144 145 chop "$binnum" 146 147 binnum="$rval" 148 149 weight=`expr "$weight" "*" 2` 150 151 done 152 153 echo "binary $binnumorig is decimal $sum"
该脚本使用的算法是利用十进制和二进制数权值 (1,2,4,8,16,..),比如二进制"10"可以这样转换成十进制:
0 * 1 + 1 * 2 = 2
为了得到单个的二进制数我们是用了lastchar 函数。该函数使用wc –c计算字符个数,然后使用cut命令取出末尾一个字符。Chop函数的功能则是移除最后一个字符。
文件循环程序
或许您是想将所有发出的邮件保存到一个文件中的人们中的一员,但是在过了几个月以后,这个文件可能会变得很大以至于使对该文件的访问速度变慢。下面的 脚本rotatefile可
以解决这个问题。这个脚本可以重命名邮件保存文件(假设为outmail)为outmail.1,而对于 outmail.1就变成了outmail.2 等等等等...
1 #!/bin/sh 2 3 # vim: set sw=4 ts=4 et: 4 5 ver="0.1" 6 7 help() 8 9 { 10 11 cat < 12 13 rotatefile -- rotate the file name 14 15 USAGE: rotatefile [-h] filename 16 17 OPTIONS: -h help text 18 19 EXAMPLE: rotatefile out 20 21 This will e.g rename out.2 to out.3, out.1 to out.2, out to out.1 22 23 and create an empty out-file 24 25 The max number is 10 26 27 version $ver 28 29 HELP 30 31 exit 0 32 33 } 34 35 error() 36 37 { 38 39 echo "$1" 40 41 exit 1 42 43 } 44 45 while [ -n "$1" ]; do 46 47 case $1 in 48 49 -h) help;shift 1;; 50 51 --) break;; 52 53 -*) echo "error: no such option $1. -h for help";exit 1;; 54 55 *) break;; 56 57 esac 58 59 done 60 61 # input check: 62 63 if [ -z "$1" ] ; then 64 65 error "ERROR: you must specify a file, use -h for help" 66 67 fi 68 69 filen="$1" 70 71 # rename any .1 , .2 etc file: 72 73 for n in 9 8 7 6 5 4 3 2 1; do 74 75 if [ -f "$filen.$n" ]; then 76 77 p=`expr $n + 1` 78 79 echo "mv $filen.$n $filen.$p" 80 81 mv $filen.$n $filen.$p 82 83 fi 84 85 done 86 87 # rename the original file: 88 89 if [ -f "$filen" ]; then 90 91 echo "mv $filen $filen.1" 92 93 mv $filen $filen.1 94 95 fi 96 97 echo touch $filen 98 99 touch $filen
这个脚本是如何工作的呢?在检测用户提供了一个文件名以后,我们进行一个9到1的循环。文件9被命名为10,文件8重命名为9等等。循环完成之后,我们将原始文件命名为文件1
同时建立一个与原始文件同名的空文件。
调试
最简单的调试命令当然是使用echo命令。您可以使用echo在任何怀疑出错的地方打印任何变量值。这也是绝大多数的shell程序员要花费80%的时间来调试程序的原因。Shell程序的
好处在于不需要重新编译,插入一个echo命令也不需要多少时间。
shell也有一个真实的调试模式。如果在脚本"strangescript" 中有错误,您可以这样来进行调试:
sh -x strangescript
这将执行该脚本并显示所有变量的值。
shell还有一个不需要执行脚本只是检查语法的模式。可以这样使用:
sh -n your_script
这将返回所有语法错误
这里Linux shell脚本基础学习就全部结束了。感谢大家的支持。
转载于:https://www.cnblogs.com/Matrix54/archive/2012/04/07/2437157.html
Shell 脚本基础学习 (四)相关推荐
- Linux shell脚本基础学习详细介绍(完整版)一
Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Li ...
- Linux shell脚本基础学习详细介绍(完整版)
Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Li ...
- Linux shell脚本基础学习
Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Li ...
- Linux shell脚本基础学习详细介绍(完整版)2
详细介绍Linux shell脚本基础学习(五) Linux shell脚本基础前面我们在介绍Linux shell脚本的控制流程时,还有一部分内容没讲就是有关here document的内容这里继续 ...
- 详细介绍Linux shell脚本基础学习(一)
2019独角兽企业重金招聘Python工程师标准>>> Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础 ...
- Shell 脚本基础学习
Shell 脚本(shell script),是一种为 shell 编写的脚本程序.Shell 编程跟 JavaScript.php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解 ...
- shell脚本编程学习笔记1(xdl)——shell基础与Bash基本功能()
shell脚本编程学习笔记1--shell基础与Bash基本功能 1,简介: 1,Shell就是一个命令行解释器,用以连接输入设别和内核. 2,Shell是解 释执行的脚本语言,在Shell中可以直接 ...
- Android:JNI与NDK(四) Shell脚本的学习以及交叉编译libjpeg图片处理库
本篇目录 一.前言 首先,向关注公众号的朋友们道个歉,很长时间没更新了,实在惭愧,这段时间忙于个人事务,耽误了很长时间. 各位小伙伴们可以关注一下我的个人github地址:https://github ...
- linux 脚本编写 -eq,关于shell脚本基础编程第四篇
shell脚本基础编程第四篇 本章主要内容:函数 函数 function: function 名称 { 命令 ; } 或 name () { 命令 ; } 定义 shell 函数. 创建一个以 NAM ...
最新文章
- CCF C³:创业公司如何面对开源?知乎CTO李大海:谢邀
- linux expect 自动交互命令 总结
- python与excel做数据可视化-用Python进行数据可视化的10种方法
- 如何去maven仓库下载jar包
- ajax使用json下拉框,ajax请求后台得到json数据后动态生成树形下拉框的方法
- Android 开源框架之 Android-async-http 源码解读
- iBatis 2.x 和 MyBatis 3.0.x 的区别
- Deep Learning(深度学习)学习笔记整理系列三
- Linux的一些简单的常用命令
- linux ssh非交互脚本,sshpass-Linux命令之非交互SSH
- 小程序分享到朋友圈_微信内测开放小程序分享到朋友圈功能
- native react 图片裁剪,使用react-native-image-picker将图片上传到firebase
- VapourSynth压制教程 【Waifu2x N卡 放大教程】
- MATLAB 2014a与 VS2013 配置过程
- 北航2017级算法第一次上机---芸如的入学测试
- error: cannot lock ref 'refs/remotes/origin/master': unable to resolve reference 'refs/remotes/origi
- RoI Pooling 和 RoI Align
- 需要在计算机安装msxml版本,安装Office2010提示需要MSXML版本6.10.1129.0的解决方法...
- mysql修改列明sql语句_sqlserver 修改列名及表名的sql语句
- 点击图片放大,实现移动端双指缩放,单指拖拽功能
热门文章
- note-删除Visual Studio recent Projects list
- 用Greasemonkey脚本收藏网站会员信息到本地
- stylus-loader (copy)
- HDU 1564 简单博弈 水
- 我的日常工具——gdb篇
- hdu3746 KMP的next数组应用,求项链首尾项链循环
- 【Linux 内核 内存管理】优化内存屏障 ③ ( 编译器屏障 | 禁止 / 开启内核抢占 与 方法保护临界区 | preempt_disable 禁止内核抢占源码 | 开启内核抢占源码 )
- 【错误记录】Git 使用报错 ( no changes added to commit (use “git add“ and/or “git commit -a“) )
- 【设计模式】中介者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
- 【Android 插件化】Hook 插件化框架 ( 从 Hook 应用角度分析 Activity 启动流程 二 | AMS 进程相关源码 | 主进程相关源码 )