Linux shell程序设计(八).杂项
好了,今天是shell变成学习的最后一篇,介绍一下其它的一些相关知识,对于初学者来说,这些只是应该是最迫切需要掌握的,因为一些if、for的语句可以慢慢领悟,但如果不了解这些边边角角的内容,别人写的例子就看不懂,严重打击自信心。所以今天的这一篇是非常重要滴。
一、算术运算
bash中的算术运算符命令为let,其语法为:
let arg ...
其中:arg是单独的算术表达式,基本用法与C语言相同。但不能使用“++”、“--”、“,”;但提供了“**”做方幂运算。
let命令可以用(())代替
例如:
let "j=i*6+2" 和 ((j=i*6+2)) 等价
let返回结果非0,则返回状态值为0,否则返回状态值为1。
注:若有特殊字符,必须有双引号括起来,比如 let "val=a|b",若不用引号则会认为|是管道符。
二、函数
函数定义的格式为:
[function]函数名()
{
命令表
}
其中function关键字可以默认不写,
调用函数时直接使用函数名,不用带(),就像使用一般的命令一样。
举例:
$ cat ex17
#func is a function name
#it echo the values of variables and arguments
func()
{
echo "Let's begin now."
echo $a $b $c
echo $1 $2 $3
echo "The end."
}
a="Working directory"
b="is"
c=`pwd`
func Welcome You Byby
echo "Today is `date`"
$ ./ex17
Let's begin now.
Working directory is /home/wangxiaoqi
Welcome You Byby
The end.
Today is .....
另注:可以直接使用return命令退出函数。后面可带参数指定退出值。
三、作业控制
在命令行最后加一个“&”就可以使该命令成为后台作业。
如果set命令的monitor选项被打开,即执行了 set -o monitor 命令,则shell进入作业管理。
1、jobs命令
不带参数的jobs命令可以列出当前尚未完成的作业。例如:
$ jobs
[2] +Done who| wc -cd
[1] -Stopped(SIGTTOU) man ls&
说明:[]中的整数代表作业号,后面的“+”代表当前作业,“-”代表前一个作业。在“+-”后面列出作业状态,最后则是作业的内容。
2、kill命令
kill命令可以向指定进程发送终止信号,例如:15表示使作业正常中止运行;9表示立即终止进程。
kill -9 1893
表示终止PID为1893进程的运行。
注:利用 kill -l 可以列出全部的信号名
3、bg和fg命令
bg用于把前台作业切换到后台,fg则相反。
$ bg(fg) %1
表示将作业1切换的后台(前台)
注:如果不带参数,表示切换当前job
四、shell内置命令
1、eval命令
该命令可以将一个字符串当作命令行来执行,例如:
$ a="id | cut -f1 -d' '"
$ eval $a
uid=0(root)
说明:不用eval命令,那么在执行时就会将“| cut -f1 -d”都作为了id命令的参数。时候eval后,它会把第一遍命令行处理所得的"id", "|", "cut", "-f1", "-d"这些字符串再次进行命令行处理,这次就能正确分析其中的管道了。
2、exec命令
格式:
exec [ arg ... ]
作用:在本shell中执行由参数arg指定的命令,不创建新进程。
注意:arg中允许有输入/输出重定向。
3、hash命令
格式:
hash [ -r ] [ name ... ]
作用:记住name指定的每个命令在搜索路径中的位置,[-r]则正好相反。
注意:如果没有参数,则列出所有已记忆的命令信息
4、readonly命令
格式:readonly [ name ... ]
作用:将name变量标记为只读
注意:若没有参数,则列出所有只读变量的清单
5、trap命令
格式:trap [ arg ] [ n ] ...
作用:当收到后面的[n]信号时,执行arg
6、type命令
格式:type [ name ... ]
作用:对于每个name,如果作为命令名,是如何被解释的
7、unset命令
格式:unset [ name ... ]
作用:删除name的相应变量或函数
注意:PATH、PS1、PS2、MAILCHECK、IFS不能被删除
8、umask命令
格式:umask [-S][mask]
作用:将用户文件创建掩码设置为mask的值
注意:若mask为八进制数,则对应位被置上;若mask为符号,则用来设置权限;若无mask,则显示当前掩码;-S以符号形式显示有关信息(rwx等权限)
9、wait命令
格式:wait [n]
作用:等待由n(进程ID)指定的进程终止,并报告终止状态
注意:若无参数,则等待所有进程终止。改参数返回值永远为0
五、脚本调试
1、解决环境设置问题
① 无法在其他环境下执行bash脚本。
在shell脚本第一行加上 #!/bin/bash
② PATH环境变量没有包括“.”,无法识别当前目录
PATH=$PATH:.
③ 脚本文件与已存在命令名字相同
修改脚本名
2、解决脚本错误
调试shell脚本的方法是打开set命令的-x选项,或者在启动shell时使用-x选项,则shell进入跟踪模式。
另一种方法是多使用echo和print命令,这样可以根据显示来判断程序错误发生在哪一步。
注:尽量改一次错误执行一次,以判断确切的错误发生地。