现在我们来讨论编写一个脚本的一般步骤。任何优秀的脚本都应该具有帮助和输入参数。并且写一个伪脚本(framework.sh),该脚本包含了大多数脚本都需要的框架结构,是一个非常不错的主意。这时候,在写一个新的脚本时我们只需要执行一下copy命令:

cp framework.sh myscript

然后再插入自己的函数。

让我们再看个例子:

二进制到十进制的转换

脚本 b2d 将二进制数 (比如 1101) 转换为相应的十进制数。这也是一个用expr命令进行数学运算的例子:

View Code

  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 等等等等...

View Code

 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 脚本基础学习 (四)相关推荐

  1. Linux shell脚本基础学习详细介绍(完整版)一

    Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Li ...

  2. Linux shell脚本基础学习详细介绍(完整版)

    Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Li ...

  3. Linux shell脚本基础学习

    Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Li ...

  4. Linux shell脚本基础学习详细介绍(完整版)2

    详细介绍Linux shell脚本基础学习(五) Linux shell脚本基础前面我们在介绍Linux shell脚本的控制流程时,还有一部分内容没讲就是有关here document的内容这里继续 ...

  5. 详细介绍Linux shell脚本基础学习(一)

    2019独角兽企业重金招聘Python工程师标准>>> Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础 ...

  6. Shell 脚本基础学习

    Shell 脚本(shell script),是一种为 shell 编写的脚本程序.Shell 编程跟 JavaScript.php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解 ...

  7. shell脚本编程学习笔记1(xdl)——shell基础与Bash基本功能()

    shell脚本编程学习笔记1--shell基础与Bash基本功能 1,简介: 1,Shell就是一个命令行解释器,用以连接输入设别和内核. 2,Shell是解 释执行的脚本语言,在Shell中可以直接 ...

  8. Android:JNI与NDK(四) Shell脚本的学习以及交叉编译libjpeg图片处理库

    本篇目录 一.前言 首先,向关注公众号的朋友们道个歉,很长时间没更新了,实在惭愧,这段时间忙于个人事务,耽误了很长时间. 各位小伙伴们可以关注一下我的个人github地址:https://github ...

  9. linux 脚本编写 -eq,关于shell脚本基础编程第四篇

    shell脚本基础编程第四篇 本章主要内容:函数 函数 function: function 名称 { 命令 ; } 或 name () { 命令 ; } 定义 shell 函数. 创建一个以 NAM ...

最新文章

  1. CCF C³:创业公司如何面对开源?知乎CTO李大海:谢邀
  2. linux expect 自动交互命令 总结
  3. python与excel做数据可视化-用Python进行数据可视化的10种方法
  4. 如何去maven仓库下载jar包
  5. ajax使用json下拉框,ajax请求后台得到json数据后动态生成树形下拉框的方法
  6. Android 开源框架之 Android-async-http 源码解读
  7. iBatis 2.x 和 MyBatis 3.0.x 的区别
  8. Deep Learning(深度学习)学习笔记整理系列三
  9. Linux的一些简单的常用命令
  10. linux ssh非交互脚本,sshpass-Linux命令之非交互SSH
  11. 小程序分享到朋友圈_微信内测开放小程序分享到朋友圈功能
  12. native react 图片裁剪,使用react-native-image-picker将图片上传到firebase
  13. VapourSynth压制教程 【Waifu2x N卡 放大教程】
  14. MATLAB 2014a与 VS2013 配置过程
  15. 北航2017级算法第一次上机---芸如的入学测试
  16. error: cannot lock ref 'refs/remotes/origin/master': unable to resolve reference 'refs/remotes/origi
  17. RoI Pooling 和 RoI Align
  18. 需要在计算机安装msxml版本,安装Office2010提示需要MSXML版本6.10.1129.0的解决方法...
  19. mysql修改列明sql语句_sqlserver 修改列名及表名的sql语句
  20. 点击图片放大,实现移动端双指缩放,单指拖拽功能

热门文章

  1. note-删除Visual Studio recent Projects list
  2. 用Greasemonkey脚本收藏网站会员信息到本地
  3. stylus-loader (copy)
  4. HDU 1564 简单博弈 水
  5. 我的日常工具——gdb篇
  6. hdu3746 KMP的next数组应用,求项链首尾项链循环
  7. 【Linux 内核 内存管理】优化内存屏障 ③ ( 编译器屏障 | 禁止 / 开启内核抢占 与 方法保护临界区 | preempt_disable 禁止内核抢占源码 | 开启内核抢占源码 )
  8. 【错误记录】Git 使用报错 ( no changes added to commit (use “git add“ and/or “git commit -a“) )
  9. 【设计模式】中介者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
  10. 【Android 插件化】Hook 插件化框架 ( 从 Hook 应用角度分析 Activity 启动流程 二 | AMS 进程相关源码 | 主进程相关源码 )