使用IFS读文件
输出时要去除冒号域分隔符,可使用变量IFS。在改变它之前保存IFS的当前设置。然后在脚本执行完后恢复此设置。
使用IFS可以将域分隔符改为冒号而不是空格或t a b键,这里有3个域需要加域分隔,即NAME、DEPT和ID。脚本如下:
Shell 允许将一组命令集或语句形成一个可用块,这些块称为shell函数,其组成部分:
函数标题,函数体
标题是函数名,应该唯一;函数体是命令集合
函数格式:
函数可以只放在同一个文件中做为一段代码,也可以放在只包含函数的单独文件中
4.1 在脚本中定义并使用函数注:函数必须在使用前定义,一般放于脚本开始部分,直至shell解释器首次发现它时,才可以使用
例脚本func1:
#!/bin/sh hello() { echo "Hello,today’s date is `date`" } echo "now, going to the function hello" hello echo "back from the function" 4.2 向函数传递参数向函数传递参数就象在一般脚本中使用特殊变量$1,$2..\(9一样,函数取得所传参数后,将原始参数传回shell,可以在函数内定义本地变量保存所传的参数,一般这样的参数名称以_开头 例:脚本对输入的名字进行检查,只能包含字母 \) vi func2
#!/bin/sh echo -n "what is your first name :" read F_NAME char_name() { _LETTERS_ONLY=$1 _LETTERS_ONLY=`echo $1|awk '{if($0~/[^a-z A-Z]/) print "1"}'` if [ "$_LETTERS_ONLY" != "" ] then return 1 else return 0 fi } if char_name $F_NAME; then echo "ok" else echo "ERRORS" fi 4.3 函数返回值函数执行完毕或者基于某个测试语句返回时,可作两种处理:
让函数正常执行到末尾,然后返回脚本中调用函数的控制部分
使用return 返回脚本中函数调用的下一条语句,可以带返回值,
0为无错误
1为有错误
格式:
可以直接在脚本调用函数语句的后面使用最后状态命令来测试函数
调用的返回值
例:
更好的办法是使用if语句测试返回0还是返回1,可以在if语句里面将函数调用用括号括起来,增加可读性,如 if hello ; then
如果函数将从测试结果中反馈输出,可以使用替换命令保存结果,函数调用的替换格式为
variable_name=function_name
函数function_name输出被设置到变量variable_name中
常用的一些函数可以收集起来,放入函数文件,使用时,将文件载入shell中
文件头应该以#!/bin/sh开头,文件名可任意选取,但建议有说明性。
文件一旦载入shell,就可以在命令行或者脚本中调用函数,可以使用set产看所有定义的函数,输出列表包括已经载入shell的所有函数。
要想改动文件,首先用unset命令从shell中删除函数,注,这里不是真正的删除,修改完毕后,再将文件重新载入,有些shell会识别改动,不必使用unset,但建议改动时使用unset命令
例:function.main
#!/bin/sh findit() { if [ $# -lt 1 ]; then echo "Usage :findit file" # 思考:为什么用findit,不用$0? return 1 fi find / -name $1 -print } 4.7 定位文件(载入文件)格式:<点><空格><路径><文件名>
$. ./function.main 4.8 检查载入的函数使用set命令查看已经载入shell中的函数
$ set 4.9 执行shell函数要执行函数,简单的键入函数名,如果需要参数,后跟参数即可
$ findit hello 4.10 修改shell函数如果需要对函数做改动,需要借助unset命令先从shell中删除函数,修改后,再重新载入
$ unset findit 修改… $ . ./function.main 第五部分 脚本调试 ——Shell脚本调试 5.1 一般的shell脚本错误a.循环错误
如for,while,until,case等结构中漏写了某个保留字
b.漏写引号
c.测试错误
如 在-eq 两边应该使用数字取值;[变量] 缺少空格
d.字符大小写
-linux对大小写敏感
…
5.2 使用set命令进行调试 set -n 读命令但不执行 set -v 显示读取的所有行 set -x 显示所有命令及其参数 set +x set选项关闭