第十六章  shell脚本介绍

此章节内容较为简单,跳过。



第十七章   条件測试

test命令

expr命令

test 

格式  test  condition     或者  [ condition ]  (注意: condition两側有空格)



文件状态測试:

  1. - d 文件夹 - s 文件长度大于0、非空 - f 正规文件
  2. - w 可写 - L 符号连接 - u 文件有s u i d位设置
  3. - r 可读 - x 可运行



測试的逻辑操作符:

-a   :逻辑与。操作符两边均为真。结果为真,否则为假。

-o   : 逻辑或。操作符两边一边为真,结果为真。否则为假。

!   : 逻辑否,条件为假,结果为真。



字符串測试:

  1. = 两个字符串相等。
  2.  
  3.  
  4. = 两个字符串不等。
  5.  
  6. -z 空串。
  7.  
  8. -n 非空串。

数值測试:

  1. -eq 数值相等。
  2.  
  3. -ne 数值不相等。
  4.  
  5. -gt 第一个数大于第二个数。 -lt 第一个数小于第二个数。
  6.  
  7. -le 第一个数小于等于第二个数。
  8.  
  9. <span style="white-space:pre"> </span>。 -ge 第一个数大于等于第二个数。

expr(一般用于整数值  也能够  用于字符串 , expr 測试成功返回  1  , 其它值为错误)

格式: expr     argument     operator    argument

对数字: expr   number1    [+ - * / 等]  number2

对字符串: expr  string1  [=  模式匹配等 ]

expr的模式匹配: expr  string  : pattern



第十八章 控制流程

退出状态

while、for 和 until loop 循环

if  then else 语句

脚本中动作

菜单



退出状态

使用 $?  查看最后退出状态。主要有4种退出状态,即 $ ?

和控制次序命令($ $、| |)。

其余两种是处理s h e l l脚本或s h e l l退出及对应退出状态或函数返回码。

退出当前进程 exit  n  。 n 为一个数值。

键入e x i t,s h e l l将试图(一般是这样)返回上一个命令返回值



循环

for
循环每次处理依次列表内信息。直至循环耗尽。

Until 循环 此循环语句不常使用,u n t i l循环直至条件为真。

条件部分在循环末尾部分。

While 循环 w h i l e循环当条件为真时,循环运行,条件部分在循环头。



if  then else  语句(也能够检測命令是否成功返回)

  1. if 条件1
  2. then 命令1
  3. elif 条件2
  4. then 命令2
  5. else 命令3
  6. fi

例子代码

  1. #!/bin/bash
  2. # it is used to create a file which add header "#!/bin/bash" automatically
  3. filename=$1
  4. # get the first parameter used as filename
  5. #echo $filename
  6. if [!$filename ]; then
  7. read var
  8. filename=$var
  9. else
  10. echo $filename
  11. fi
  12. echo '#!/bin/bash' > $filename # write data to filename
  13. vim $filename # open file with vim editor

一段简单脚本代码,在当前文件夹下创建一个当前文件夹不存在的文件。键入 文件名称 -h 还能够查看帮助文档。

  1. #!/bin/bash
  2. fname=$1
  3. function help(){
  4. echo "this is a simple helper document for use this tool";
  5. echo "basic form : ./newFile [option] [filename]";
  6. echo -e "\t -h\t print this help page"
  7. }
  8. if [ $fname ]; then
  9. case $fname in
  10. -h) help;exit;;
  11. esac
  12. fileArray=$(ls -a)
  13. for aFile in $fileArray; do
  14. if [ $aFile = $fname ]; then
  15. echo " file $fname already exits ."
  16. exit
  17. fi
  18. done;
  19. else
  20. echo "please input a file name that will be created ! "
  21. exit
  22. fi
  23. touch $fname && echo "file $fname create success !"

if 检查命令运行结果

  1. #!/bin/bash
  2. #name: if_test_comman
  3. if grep -nr "good" ./ > /dev/null 2>&1
  4. then echo "string good found !"
  5. else echo "there isn't a string called good under $PWD"
  6. fi

測试传递參数个数: if [ $# lt n ] 。then 命令  ; 假设传入參数少于 n  个。 那么运行命令。

推断脚本是否为交互模式(终端模式)还是非交互模式(c r o n或a t): if [  -t ]

检測前面近期一个的命令状态: if [ $? = 0  ] ; then 命令



case 语句 (模式中能够是常量和变量)

  1. <span style="font-size:14px;"><strong>case 值 in
  2. 模式1)命令...;;
  3. 模式2)命令...;;
  4. 模式3)命令...;;
  5. ......
  6. esac</strong></span>

模式中还能够包括元字符:

*   随意字符。;?随意单字符。。[..]   类或范围中随意字符。

  1. #!/bin/bash
  2. case $1 in
  3. "1") echo "one";;
  4. "2") echo "two";;
  5. "3") echo "three";;
  6. "4") echo "four";;
  7. "5") echo "five";;
  8. "6"|"six") echo "six";;
  9. *)echo "unknown data $1"
  10. esac <span style="color:#006600;"> </span>

for 循环  

  1. for in 列表(假设不指定列表,默认取位置參数)
  2. do
  3. 命令...
  4. done



使用for循环显示全部的位置參数(能够是随意个数的參数)

  1. #!/bin/bash
  2. #name: for_use_geovar
  3. echo -e "location variables are : \c"
  4. for VAR # the same as “in "$@"” or "in "$*""
  5. do
  6. echo -e $VAR "\c"
  7. done
  8. echo ""

嵌套for循环

  1. for 变量名1 in列表1
  2. d o
  3. <span style="white-space:pre"> </span>for 变量名2 in 列表2
  4. <span style="white-space:pre"> </span>d o
  5. <span style="white-space:pre"> </span>命令1
  6. <span style="white-space:pre"> </span>. . .
  7. <span style="white-space:pre"> </span>d o n e
  8. d o n e

until 循环(一般可用while循环替代。通常情况while循环优于until循环)

  1. until 条件
  2. do
  3. <span style="white-space:pre"> </span>命令1
  4. <span style="white-space:pre"> </span>. . .
  5. d o n e

while 循环

  1. while 命令
  2. d o
  3. <span style="white-space:pre"> </span>命令1
  4. <span style="white-space:pre"> </span>. . .
  5. d o n e

while从文件里读取数据:

  1. <span style="font-size:14px;"><strong>while read LINE
  2. do
  3. XXX
  4. echo $LINE
  5. done < filename</strong></span>

break 和 continue 适合于 case 和循环。



第十九章    shell 函数

shell 函数定义:一组命令集或语句组成的可用块。

函数的组成: 函数标题   和   函数体。

使用函数能够节省大量的脚本编写时间。创建可用和可重用的脚本非常有意义。能够使主脚本变短,结构更加清晰。



定义函数

在脚本中使用函数

在函数文件里使用函数

函数举例



定义函数(全部函数在使用前必须定义)

定义函数的格式为:

  1. [function] 函数名(){
  2. 命令1
  3. ...
  4. }

在脚本中使用函数:

  1. #!/bin/bash
  2. function hello(){
  3. echo "hellow ting , nice to meet you !"
  4. }
  5.  
  6. echo "today is `date`"
  7. hello
  8. echo "I'm glad to see you again ~_~!"

向函数中传递參数

想函数传递參数跟向脚本传递參数一样(使用位置变量參数 $1,$2,...)。函数取得所传參数后,将原始參数传回shell脚本。

函数离调用參数的转换下面划线開始。后加变量名,如 : _key。



从调用函数中返回

1、函数正常运行到函数末尾,然后返回脚本中调用函数的控制部分。

2、使用return返回

  1. return 从函数中返回,使用最后状态命令决定返回值
  2. return 0 无错误返回
  3. return 1 有错误返回

函数返回值測试:

  1. hello
  2. if [ $? =0 ] ; then
  3. 或者
  4. if hello ; then

在shell中使用函数

1、创建函数文件 (随意文件)

2、将函数文件加载shell  (.  函数文件位置)(能够通过set查看全部加载当前shell的函数。unset删除shell函数)

3、运行shell函数   (函数名称   參数 ....)

如:  函数文件 funs.h

  1. #!/bin/bash
  2.  
  3. function find_file(){
  4. tarName=$1;
  5. if [ -n tarName ]; then
  6. find ./ -name ${tarName}
  7. else
  8. echo "please input a file name ."
  9. fi
  10. }

将该文件加载shell : . funs.h

运行函数: find_file    filename(随意字符串)



在脚本中调用函数

要在脚本中调用函数,必须先定义该函数(在调用之前)。



在脚本中调用函数文件里的函数:

1、首先创建函数文件

2、在脚本文件里加载函数文件(跟在shell中加载函数文件类似)

3、调用函数

如: call_fun.sh 和 funs.h 文件在同一个文件夹,其内容例如以下:

  1. #!/bin/bash
  2. . funs.h
  3. find_file $1

第二十章  向脚本传递參数

shift

getopts



shift

shift作用: 在向脚本传递參数时,shift 能够将每个參数向左偏移一位。

  1. #!/bin/bash
  2. while [ $# -ne 0 ] #while ther are still arguments
  3. do
  4. echo $1
  5. shift
  6. done

最后一个參数获取的方法:

  1. eval echo \$$# 或 shift 'expr $# -2'

通过验证在ubuntu12.04上 第二个命令应该为 : shift  `expr $# - 1` 。 shift 后接偏移的数量然后用$1 就能够取得该值。  如  lastVar.sh :

  1. #!/bin/bash
  2. shift `expr $# - 1`
  3. echo $1

./lastVar.sh file name good   , 输出结果为good



getopts

假设要控制诸如  command  -l    -c      23    -v       file1      file2    时。shift命令就不够了。此时该用getopts命令。

getopts 格式:  getopts  varString  variable

  1. #!/bin/bash
  2.  
  3. ALL=false
  4. HELP=false
  5. FILE=false
  6. VERBOSE=false
  7.  
  8. while getopts ahfv OPTION
  9. do
  10. case $OPTION in
  11. a) ALL=true; echo "ALL is $ALL";;
  12. h) HELP=true; echo "HELP is $HELP";;
  13. f) FILE=true; echo "FILE is $FILE";;
  14. v) VERBOSE=true; echo "VERBOSE is $VERBOSE";;
  15. esac
  16. done

假设參数中包括一个未指定的选项參数 。如 ./getopts_test.sh -p 则提示: ./getopts_test.sh: illegal option -- p

getopts指定变量必须取值:将冒号放在选项后面,如对上述代码   ahfv 改动为 ahfvt: ,那么t必须指定取值。

用法为  ./getopts -[a h f v] -[t value] XXX



第二十一章   创建屏幕输出

tput命令

使用转义序列和产生控制码

使用颜色



tput

使用tput前。须要先初始化:  tput  init

经常使用字符串:

  1. 名字 含义
  2. b e l 警铃
  3. b l i n k 闪烁模式
  4. b o ld 粗体
  5. c i v i s 隐藏光标
  6. c l e a r 清屏
  7. c n o r m 不隐藏光标
  8. c u p 移动光标到屏幕位置(xy
  9. e l 清除到行尾
  10. e l l 清除到行首
  11. s m s o 启动突出模式
  12. r m s o 停止突出模式
  13. s m u l 開始下划线模式
  14. r m u l 结束下划线模式
  15. s c 保存当前光标位置
  16. rc 恢复光标到最后保存位置
  17. s g r 0 正常屏幕
  18. r e v 逆转视图

经常使用数字:

  1. 名字 含义
  2. c o l s 列数目
  3. i t t a b设置宽度
  4. l i n e s 屏幕行数

bool操作符

  1. 名字 含义
  2. c h t s 光标不可见
  3. h s 具有状态行

通过发送命令打开和关闭光标(Linux/BSD):

  1. echo -e "\033[?
  2.  
  3. 25h" echo -e "\033[?25l"

System V :

  1. echo "\033[?25h" echo "\033[?25l"

发送命令清屏,而且将光标移动到左上角(Linux/BSD)

  1. echo -e "\033[2J"

使用颜色:

产生颜色格式 : escape [ background_color;foreground_color m

linux/bsd : echo -e "\033[40;33m"  (黑色背景,黄色字体)



第二十二章   创建屏幕输入

差点儿都是实例操作代码,略过。



第二十三章  调试脚本

一般错误

set命令介绍



一般错误

1、循环错误

2、漏泄引號

3、測试错误 [ condition ] , condition 两边都有空格。

4、字符大写和小写

5、for循环  注意$符号

6、echo  , 不要在echo命令后直接加最后状态命令,此时值永远为真



set命令 (-打开选项, +关闭选项)

set [-n (读命令但不运行)     |     -v(显示读取的全部行)     |    -x(显示全部的命令及其參数)]





第二十四章   shell 嵌入命令

shell 嵌入命令在 bourne shell 里面创建而不是存在于 /bin 或  /usr/bin文件夹里。同样的命令 。嵌入命令要比系统命令要快。



标准的bourne shell  嵌入命令列表

  1. 空,永远返回为t r u e
  2. . 从当前shell中运行操作
  3. break 退出forwhileuntilcase语句
  4. cd 改变到当前文件夹
  5. continue 运行循环的下一步
  6. echo 反馈信息到标准输出
  7. eval 读取參数,运行结果命令
  8. exec 运行命令,但不在当前shell
  9. exit 退出当前shell
  10. export 导出变量,使当前 shell 可利用它
  11. pwd 显示当前文件夹
  12. read 从标准输入读取一行文本
  13. readonly 使变量仅仅读
  14. return 退出函数并带有返回值
  15. set 控制各种參数到标准输出的显示
  16. shift 命令行參数向左偏移一个
  17. test 评估条件表达式
  18. times 显示 shell 运行过程的用户和系统时间
  19. trap 当捕获信号时运行指定命令
  20. ulimit 显示或设置 shell 资源
  21. umask 显示或设置缺省文件创建模式
  22. unset shell 内存中删除变量或函数
  23. wait 等待直到子进程运行完成。报告终止

set在脚本内部给出执行參数(主要作用是用于測试脚本的时候避免每次都要输入參数):

  1. #!/bin/bash
  2. set ting er xy
  3. while [ $# != 0 ]
  4. do
  5. echo $1
  6. shift
  7. done

假设运行脚本时带了參数,那么后面的參数会被脚本内部的參数给覆盖掉。

times : times第一行给出shell消耗时间。第二行给出执行命令消耗时间

type: 查询命令是否仍驻留系统及命令类型。

  1. #!/bin/bash
  2. set cd good
  3. while [ $# != 0 ]
  4. do
  5. if type $1 > /dev/null 2>&1;then
  6. echo "command $1 is still in shell ."
  7. else
  8. echo "the command $1 not found ."
  9. fi
  10. shift
  11. done

用type 查询命令是否驻留在系统中,屏蔽type的输出,使用我们自己定义的输出。



ulimit:设置执行在shell上的显示限制

-a 显示当前的全部限制

-c 限制内核垃圾大小

-f  限制执行进程输出文件的大小



wait :等待子进程完毕。不带进程id会等待全部的子进程完毕。

Linux Unix shell 编程指南学习笔记(第四部分)的更多相关文章

  1. Linux Unix shell 编程指南学习笔记(第五部分)

    第二十五章 深入讨论 << 当shell 看到 << 的时候,它知道下一个词是一个分界符.该分界符后面的内容都被当做输入,直到shell又看到该分界符(位于单独的一行).比方: ...

  2. Linux Unix shell 编程指南学习笔记(第三部分)

    第十三章  登陆环境 登陆系统时.输入username和password后.假设验证通过.则进入登录环境. 登录过程 文件/etc/passwd $HOME.profile 定制$HOME.profi ...

  3. Linux Unix shell 编程指南学习笔记(第二部分)

    第七章  正則表達式介绍 匹配行首与行尾 匹配数据集 职匹配字母和数字 句点 "." 匹配随意单字符. ^,在行首 匹配字符串或字符序列,如查询当前文件夹下的全部文件夹: ls - ...

  4. Linux 与 unix shell编程指南——学习笔记

    第一章    文件安全与权限 文件访问方式:读,写,执行.     针对用户:文件属主,同组用户,其它用户.     文件权限位最前面的字符代表文件类型,常用的如         d 目录:l 符号链 ...

  5. Linux与Unix shell编程指南(完整高清版).pdf

    找到一本很详细的Linux Shell脚本教程,其实里面不光讲了Shell脚本编程,还介绍了系统的各种命令 http://vdisk.weibo.com/s/yVBlEojGMQMpv 本书共分五部分 ...

  6. 摘自《Linux与unix shell编程指南》

    shift运行后,$#随之减少:如果需要知道命令行中输入的最后一个参数(通常是一个文件名),可以有两种选择:使用命令 eval echo \$$#;使用shift命令:shift 'expr $# - ...

  7. Linux与unix shell编程指南

    第14章 环境和shell变量 1.使用变量时,尽量用花括号将之括起来,防止shell误解变量值. 2.设置变量时的不同模式 variable-name=value 设置实际值到variable-na ...

  8. maven权威指南学习笔记(四)—— maven生命周期(lifecycle)

    定义: 生命周期是包含在一个项目构建中的一系列有序的阶段 举个例子来说就是maven 对一个工程进行: 验证(validate) -- 编译源码(compile) -- 编译测试源码(test-com ...

  9. maven生命周期(lifecycle)—— maven权威指南学习笔记(四)

    定义: 生命周期是包含在一个项目构建中的一系列有序的阶段 举个例子来说就是maven 对一个工程进行: 验证(validate) …… 编译源码(compile) …… 编译测试源码(test-com ...

随机推荐

  1. [oldboy-django][1初始django]web框架本质 + django框架 + ajax

    web框架本质 浏览器(socket客户端) - 发送请求(ip和端口,url http://www.baidu.com:80/index/) - GET 请求头(数据请求行的url上: Http1. ...

  2. chrome浏览器无法安装非应用商店插件的解决办法

    不久前,安装了一个非chrome应用商店的第三方应用,今天突然发现无法使用,打开chrome的扩展程序后,发现该插件以及被禁用,在网上查找了解决方法,设置“开发者模式”,修改了chrome的参数,仍然 ...

  3. 版本控制——hg教程

    hg教程 引用来自官方网站的思维导图,来说明hg的使用规则:

  4. 密码 (pasuwado)

    密码 (pasuwado) 题目描述 哪里有压迫,哪里就有反抗. moreD的宠物在法庭的帮助下终于反抗了.作为一只聪明的宠物,他打算把魔法使moreD的魔法书盗去,夺取moreD的魔法能力.但mor ...

  5. vue父组件向子组件传递数据

    父组件 <template> <div id="app"> <v-header :childseller="fatherseller&quo ...

  6. Linux 命令行下使用多行输入

    比较简单,建议实操,直接上图: 一行结束,直接敲回车换行.上一个例子,输入eof,终止多行输入:下一个例子,输入done,终止多行 ~~ 如果是参数太多,一行输入不完,可以通过 "空格\en ...

  7. pat 甲级 1066. Root of AVL Tree (25)

    1066. Root of AVL Tree (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue An A ...

  8. 介绍一款可以滚动加载的插件droploader

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. Atcoder CODE FESTIVAL 2017 qual C C - Inserting 'x' 回文串

    题目链接 题意 给定字符串\(s\),可以在其中任意位置插入字符\(x\). 问能否得到一个回文串,若能,需插入多少个\(x\). 思路 首先统计出现次数为奇数的字符\(cnt\). \(cnt\ge ...

  10. 安卓全屏状态下键盘充满屏幕留不出ui控件的解决办法附edittext和键盘的属性

    1.我们先看看常用和不常用的属性值(Edittext) android:inputType参数类型说明 android:inputType="none"--输入普通字符 andro ...