exec命令有两种不同的用法,它的典型用法是将当前shell替换为一个不同的程序。例如:
exec wall "Thanks for all the fish"
脚本中的这个命令会用wall命令替换当前的shell,脚本程序中exec命令后面的代码都不会执行,因为执行这个脚本的shell已经不存在了。
8.exit n命令
exit命令使脚本程序以退出码n结束运行。如果在任何一个交互式shell的命令提示符中使用这个命令,它会使退出系统。如果允许脚本程序退出时不指定一个退出状态,那么该脚本中最后一条被执行命令的状态将被用作返回值。在脚本程序中提供一个退出码总是一个良好的习惯。
在shell脚本编程中,退出码0表示成功。
下面是一个简单的例子,如果当前目录下存在一个名为.profile的文件,它返回0表示成功,返回1表示失败:
#!/bin/sh
if [ -f *.profile ]
then
exit 0
fi
exit 1
如果追求更简洁的版本,则为:
[ -f *.profile ] && exit 0 || exit 1
set命令的作用是为shell设置参数变量。许多命令的输出结果是以空格分隔的值,如果需要使用输出结果中的某个域,这个命令就非常有用。
假设想在一个shell脚本中使用当前月份的名字。系统本身提供了一个date命令,它的输出结果中包含了字符串形式的月份名称,但是需要把它与其他区域分隔开。可以将set命令和$(...)结构相结合起来执行date命令,并且返回想要的结果。date命令的输出把月份字符串作为它的第二个参数:
#!/bin/sh
echo the date is $(date)
set $(date)
echo the month is $2
exit 0
这个程序把date命令的输出设置为参数列表,然后通过位置参数$2获得月份。
通过这个例子可以看到date命令怎样提取位置参数,由于date命令的输出受本地语言的影响较大,应该使用date +%B命令来提取月份名字。
可以通过set命令和它的参数来控制shell的执行方式,其中最常用的命令格式是set -x,它让一个脚本程序跟踪现实它当前执行的命令。
编写脚本程序时,需要捕获一条命令的执行结果,并把它用在shell脚本程序中。即执行一条命令,并把命令的输出放到一个变量中。
所有的新脚本程序都应该使用$(...)形式,$(command)的结果就是其中命令的输出。注意,这不是该命令的退出状态,而是它的字符串形式的输出结果。例如:
echo The current directory is $PWD
echo The current users are $(who)
如果要将命令的结果放到一个变量中,可以按照通常的方法来给它赋值,如下所示:
value=$(who)
echo $value
这种把命令的执行结果放到变量中的能力是非常强大的,它使得在脚本程序中使用现有命令并捕获其输出变得很容易。如果需要把一条命令在标准输出上的输出转换为一组参数,并且将它们用做为另一个程序的参数,命令xargs可以完成这个任务。