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命令,这样可以根据显示来判断程序错误发生在哪一步。
				
		
		
				
						
						
				 
		
				
						    注:尽量改一次错误执行一次,以判断确切的错误发生地。