Linux Shell 编程基础详解——吐血整理,墙裂推荐! (6)

使用IFS读文件
输出时要去除冒号域分隔符,可使用变量IFS。在改变它之前保存IFS的当前设置。然后在脚本执行完后恢复此设置。
使用IFS可以将域分隔符改为冒号而不是空格或t a b键,这里有3个域需要加域分隔,即NAME、DEPT和ID。脚本如下:

#!/bin/sh # save the setting of IFS SAVEDIFS=$IFS # assign new separator to IFS IFS=: INPUT_FILE=names2.txt NAME_HOLD="Peter James" LINE_NO=0 if [ -s $INPUT_FILE ]; then while read NAME DEPT ID do LINE_NO=`expr $LINE_NO + 1` if [ "$LINE_NO" -le "2" ]; then continue fi if [ "$NAME" = "$NAME_HOLD" ]; then continue else echo "Now processing …$NAME $DEPT $ID" fi done < $INPUT_FILE # restore the settings of IFS IFS=$SAVEDIFS else echo "`basename $0 ` : Sorry file not found or there is no data in the file >&2" exit 1 fi 第四部分 Shell 函数

Shell 允许将一组命令集或语句形成一个可用块,这些块称为shell函数,其组成部分:
函数标题,函数体
标题是函数名,应该唯一;函数体是命令集合
函数格式:

函数名() { 命令1 … } 或者 function 函数名() { …. }

函数可以只放在同一个文件中做为一段代码,也可以放在只包含函数的单独文件中

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为有错误
格式:

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

可以直接在脚本调用函数语句的后面使用最后状态命令来测试函数
调用的返回值
例:

hello #这里是hello函数被调用 if [ $? = 0 ] then echo “it is ok” else echo “something is wrong with hello function” fi

更好的办法是使用if语句测试返回0还是返回1,可以在if语句里面将函数调用用括号括起来,增加可读性,如 if hello ; then

如果函数将从测试结果中反馈输出,可以使用替换命令保存结果,函数调用的替换格式为
variable_name=function_name
函数function_name输出被设置到变量variable_name中

4.5 在shell中使用函数

常用的一些函数可以收集起来,放入函数文件,使用时,将文件载入shell中
文件头应该以#!/bin/sh开头,文件名可任意选取,但建议有说明性。
文件一旦载入shell,就可以在命令行或者脚本中调用函数,可以使用set产看所有定义的函数,输出列表包括已经载入shell的所有函数。
要想改动文件,首先用unset命令从shell中删除函数,注,这里不是真正的删除,修改完毕后,再将文件重新载入,有些shell会识别改动,不必使用unset,但建议改动时使用unset命令

4.6 创建函数文件

例: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选项关闭

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zydzpj.html