第十六章 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 euntil 循环(一般可用while循环替代。通常情况while循环优于until循环)
until 条件do 命令1 . . .d o n ewhile 循环
while 命令d o 命令1 . . .d o n ewhile从文件里读取数据:
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会等待全部的子进程完毕。