第十六章 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 命令3 fi
例子代码
#!/bin/bash # it is used to create a file which add header "#!/bin/bash" automatically filename=$1 # get the first parameter used as filename #echo $filename if [!$filename ]; then read var filename=$var else echo $filename fi echo '#!/bin/bash' > $filename # write data to filename vim $filename # open file with vim editor
一段简单脚本代码,在当前文件夹下创建一个当前文件夹不存在的文件。键入 文件名称 -h 还能够查看帮助文档。
#!/bin/bash fname=$1 function help(){ echo "this is a simple helper document for use this tool"; echo "basic form : ./newFile [option] [filename]"; echo -e " -h 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 ! " exit fi touch $fname && echo "file $fname create success !"
if 检查命令运行结果
#!/bin/bash #name: if_test_comman if 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 语句 (模式中能够是常量和变量)
<span style="font-size:14px;"><strong>case 值 in 模式1)命令...;; 模式2)命令...;; 模式3)命令...;; ...... esac</strong></span>
模式中还能够包括元字符:
* 随意字符。;?随意单字符。。[..] 类或范围中随意字符。
#!/bin/bash case $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 <span style="color:#006600;"> </span>
for 循环
for 值 in 列表(假设不指定列表,默认取位置參数) do 命令... done
#!/bin/bash #name: for_use_geovar echo -e "location variables are : c" for VAR # the same as “in "$@"” or "in "$*"" do echo -e $VAR "c" done echo ""
嵌套for循环
for 变量名1 in列表1 d o <span style="white-space:pre"> </span>for 变量名2 in 列表2 <span style="white-space:pre"> </span>d o <span style="white-space:pre"> </span>命令1 <span style="white-space:pre"> </span>. . . <span style="white-space:pre"> </span>d o n e d o n e
until 循环(一般可用while循环替代。通常情况while循环优于until循环)
until 条件 do <span style="white-space:pre"> </span>命令1 <span style="white-space:pre"> </span>. . . d o n e
while 循环
while 命令 d o <span style="white-space:pre"> </span>命令1 <span style="white-space:pre"> </span>. . . d o n e
while从文件里读取数据:
<span style="font-size:14px;"><strong>while read LINE do XXX echo $LINE done < filename</strong></span>
break 和 continue 适合于 case 和循环。
第十九章 shell 函数
shell 函数定义:一组命令集或语句组成的可用块。
函数的组成: 函数标题 和 函数体。
使用函数能够节省大量的脚本编写时间。创建可用和可重用的脚本非常有意义。能够使主脚本变短,结构更加清晰。
定义函数
在脚本中使用函数
在函数文件里使用函数
函数举例
定义函数(全部函数在使用前必须定义)
定义函数的格式为:
[function] 函数名(){ 命令1 ... }
在脚本中使用函数:
#!/bin/bash function hello(){ echo "hellow ting , nice to meet you !" } echo "today is `date`" hello echo "I'm glad to see you again ~_~!"
向函数中传递參数
想函数传递參数跟向脚本传递參数一样(使用位置变量參数 $1,$2,...)。函数取得所传參数后,将原始參数传回shell脚本。
函数离调用參数的转换下面划线開始。后加变量名,如 : _key。
从调用函数中返回
1、函数正常运行到函数末尾,然后返回脚本中调用函数的控制部分。
2、使用return返回
return 从函数中返回,使用最后状态命令决定返回值 return 0 无错误返回 return 1 有错误返回
函数返回值測试:
hello if [ $? =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.h find_file $1
第二十章 向脚本传递參数
shift
getopts
shift
shift作用: 在向脚本传递參数时,shift 能够将每个參数向左偏移一位。
#!/bin/bash while [ $# -ne 0 ] #while ther are still arguments do echo $1 shift done
最后一个參数获取的方法:
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=false HELP=false FILE=false VERBOSE=false while getopts ahfv OPTION do 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";; esac 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
经常使用字符串:
名字 含义 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 "