博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux Unix shell 编程指南学习笔记(第四部分)
阅读量:4686 次
发布时间:2019-06-09

本文共 7773 字,大约阅读时间需要 25 分钟。

第十六章  shell脚本介绍

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

第十七章   条件測试

test命令

expr命令

test 

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

文件状态測试:

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

測试的逻辑操作符:

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

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

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

字符串測试:

=     两个字符串相等。

; !

= 两个字符串不等。

-z 空串。

。 -n 非空串。

数值測试:

-eq   数值相等。

; -ne 数值不相等。

-gt 第一个数大于第二个数。 。 -lt 第一个数小于第二个数。

-le 第一个数小于等于第二个数。

<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  语句(也能够检測命令是否成功返回)

if  条件1	then  命令1	elif	条件2		then 命令2	else 命令3fi

例子代码

#!/bin/bash# it is used to create a file which add header "#!/bin/bash" automaticallyfilename=$1# get the first parameter used as filename#echo $filenameif [!$filename ]; then        read var        filename=$varelse        echo $filenamefiecho '#!/bin/bash' > $filename # write data to filenamevim $filename # open file with vim editor
一段简单脚本代码,在当前文件夹下创建一个当前文件夹不存在的文件。键入 文件名称 -h 还能够查看帮助文档。

#!/bin/bashfname=$1function help(){    echo "this is a simple helper document for use this tool";    echo "basic form : ./newFile [option] [filename]";    echo -e  "\t -h\t print this help page"}if [ $fname ]; then    case $fname in    -h) help;exit;;    esac    fileArray=$(ls -a)    for aFile in $fileArray; do        if [ $aFile = $fname ]; then            echo " file $fname already exits ."            exit        fi    done;else    echo "please input a file name that will be created ! "    exitfitouch $fname && echo "file  $fname  create success !"
if 检查命令运行结果

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

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

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

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

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

case   值   in模式1)命令...;;模式2)命令...;;模式3)命令...;;......esac

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

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

#!/bin/bashcase $1 in        "1") echo "one";;        "2") echo "two";;        "3") echo "three";;        "4") echo "four";;        "5") echo "five";;        "6"|"six") echo "six";;        *)echo "unknown data $1"esac   

for 循环  

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

使用for循环显示全部的位置參数(能够是随意个数的參数)
#!/bin/bash#name:  for_use_geovarecho -e "location variables are : \c"for VAR   # the same as “in "$@"” or  "in "$*""do    echo -e  $VAR "\c"doneecho ""
嵌套for循环

for  变量名1  in列表1d o	for  变量名2  in  列表2	d o		命令1		. . .	d o n ed o n e
until 循环(一般可用while循环替代。通常情况while循环优于until循环)

until  条件do	命令1	. . .d o n e
while 循环

while  命令d o	命令1	. . .d o n e
while从文件里读取数据:

while read LINEdoXXXecho $LINEdone  < filename

break 和 continue 适合于 case 和循环。

第十九章    shell 函数

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

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

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

定义函数

在脚本中使用函数

在函数文件里使用函数

函数举例

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

定义函数的格式为:

[function]  函数名(){    命令1    ...}
在脚本中使用函数:

#!/bin/bash function hello(){    echo "hellow ting , nice to meet you !"}echo "today is `date`"helloecho "I'm glad to see you again ~_~!"
向函数中传递參数

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

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

从调用函数中返回

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

2、使用return返回

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

函数返回值測试:

helloif [ $? =0 ] ; then或者if  hello ; then
在shell中使用函数

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

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

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

如:  函数文件 funs.h

#!/bin/bash function find_file(){    tarName=$1;    if [ -n tarName ]; then            find ./ -name ${tarName}    else            echo "please input a file name ."    fi  }
将该文件加载shell : . funs.h

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

在脚本中调用函数

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

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

1、首先创建函数文件

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

3、调用函数

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

#!/bin/bash . funs.hfind_file $1

第二十章  向脚本传递參数

shift

getopts

shift

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

#!/bin/bash while [ $# -ne 0 ]   #while ther are still argumentsdo    echo $1    shiftdone
最后一个參数获取的方法:

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

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

getopts

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

getopts 格式:  getopts  varString  variable

#!/bin/bash ALL=falseHELP=falseFILE=falseVERBOSE=falsewhile getopts ahfv OPTIONdo    case $OPTION in    a) ALL=true;        echo "ALL is $ALL";;    h) HELP=true;       echo "HELP is $HELP";;    f) FILE=true;       echo "FILE is $FILE";;    v) VERBOSE=true;    echo "VERBOSE is $VERBOSE";;    esacdone
假设參数中包括一个未指定的选项參数 。如 ./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

经常使用字符串:

名字              含义  b e l              警铃  b l i n k          闪烁模式  b o ld             粗体  c i v i s          隐藏光标  c l e a r          清屏  c n o r m          不隐藏光标  c u p              移动光标到屏幕位置(x,y)  e l                清除到行尾  e l l              清除到行首  s m s o            启动突出模式   r m s o            停止突出模式  s m u l            開始下划线模式  r m u l            结束下划线模式  s c                保存当前光标位置  rc                 恢复光标到最后保存位置  s g r 0            正常屏幕  r e v              逆转视图
经常使用数字:

名字			含义	c o l s			列数目	i t			t a b设置宽度	l i n e s		屏幕行数
bool操作符

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

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

echo -e "\033[?

25h" 和 echo -e "\033[?25l"

System V : 

echo "\033[?25h"       和  echo "\033[?25l"
发送命令清屏,而且将光标移动到左上角
(Linux/BSD)

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  嵌入命令列表

:		空,永远返回为t r u e.		从当前shell中运行操作break		退出for、while、until或case语句cd		改变到当前文件夹continue	运行循环的下一步echo		反馈信息到标准输出eval		读取參数,运行结果命令exec		运行命令,但不在当前shellexit		退出当前shellexport		导出变量,使当前  shell  可利用它pwd		显示当前文件夹read		从标准输入读取一行文本readonly	使变量仅仅读return		退出函数并带有返回值set		控制各种參数到标准输出的显示shift		命令行參数向左偏移一个test		评估条件表达式times		显示  shell 运行过程的用户和系统时间trap		当捕获信号时运行指定命令ulimit		显示或设置  shell  资源umask		显示或设置缺省文件创建模式unset		从  shell  内存中删除变量或函数wait		等待直到子进程运行完成。报告终止
set在脚本内部给出执行參数(主要作用是用于測试脚本的时候避免每次都要输入參数):

#!/bin/bash set ting er xywhile [ $# != 0 ] do    echo $1    shiftdone
假设运行脚本时带了參数,那么后面的參数会被脚本内部的參数给覆盖掉。

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

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

#!/bin/bash set cd goodwhile [ $# != 0 ] do    if type $1 > /dev/null 2>&1;then        echo "command $1 is still in shell ."    else        echo "the command $1 not found ."    fi      shiftdone
用type 查询命令是否驻留在系统中,屏蔽type的输出,使用我们自己定义的输出。

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

-a 显示当前的全部限制

-c 限制内核垃圾大小

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

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

转载于:https://www.cnblogs.com/cxchanpin/p/6816367.html

你可能感兴趣的文章
UVa 10815 Andy's First Dictionary
查看>>
ubuntu搭建nodejs生产环境——快速部署手册
查看>>
数据挖掘引论
查看>>
浅入深出Vue:工具准备之PostMan安装配置及Mock服务配置
查看>>
Tomcat6启用Gzip压缩功能
查看>>
Java字节码浅析(二)
查看>>
Vue选项卡
查看>>
http协议和四个层之间的关系
查看>>
(3)剑指Offer之数值的整数次方和调整数组元素顺序
查看>>
MongoDB学习笔记(索引)
查看>>
iOS - UIView
查看>>
VIM7.3设置(for Windows)
查看>>
[bzoj 1143]最长反链二分图最大匹配
查看>>
SpringBoot(一)
查看>>
Azure Powershell script检测登陆并部署ARM Template
查看>>
SSO
查看>>
【LeetCode刷题系列 - 003题】Longest Substring Without Repeating Characters
查看>>
常用git命令
查看>>
深入了解HTTP协议、HTTP协议原则
查看>>
软件开发者最重要的四大技能(转)
查看>>