最近一直在学习Nutch-2.2.1,在阅读crawl和nutch脚本时,总是遇到美元符号$后面跟一些数字、问号之类的表示方式,对于后面跟数字的情况,之前略有了解,表示脚本执行时后跟的参数,比如0表示脚本的名称,1表示第一个参数,2表示第二个参数,以此类推等等,但是对于问号、叹号、星号就不是特别清楚了,在网上查阅了一些文章,但一般都缺少代码参考,所以自己就编写了测试脚本,基本涵盖了脚本参数的使用方式。下面先列出脚本参数的含义,然后再执行脚本看看实际的执行情况。
$0表示执行脚本的名称,比如在终端窗口执行./start.sh,则$0的值为start.sh
$n(n=1,2,3,……)为执行脚本时后面所跟的参数,比如在终端窗口执行./start.sharg1 arg2,则$1的值为arg1,$2的值为arg2。
$#表示执行脚本后面所跟的参数个数,注意不包括脚本本身在内,比如在上面所举的第二个例子中,$#的值为2。
$$表示该脚本执行时,操作系统分配给其的PID,也就是进程ID。
$!表示最后一个在后台执行的进程的PID。
$*表示脚本后面的所有参数,这些参数被作为一个单词。
$@与$*同义,但是参数被作为单独的单词,而不是一个单词。
$@与$*的区别只有在被双引号括起来时才会表现起来,否则二者的效果是一样的
$?表示脚本中执行上一个指令、脚本或者函数的结果,通常用于判断是否正确退出,0表示正确,非0表示执行过程错误。
下面看一段具体的代码,然后看看输出结果,重点看一下$@与$*的相同于不同之处
#!/bin/bash echo $0 echo $# echo $$ ls /home/hadoop > /dev/null echo $? i=1 for arg in "$*" do echo "arg$i=$arg" let i=i+1 done echo i=1 for arg in "$@" do echo "arg$i=$arg" let i=i+1 done echo i=1 for arg in $* do echo "arg$i=$arg" let i=i+1 done
[hadoop@hadoop code]$ ./shellArg.sh arg1 arg2 arg3 agr4 arg5 arg6 arg7 arg8 arg9 arg10 arg11 ./shellArg.sh 11 3280 0 arg1=arg1 arg2 arg3 agr4 arg5 arg6 arg7 arg8 arg9 arg10 arg11 arg1=arg1 arg2=arg2 arg3=arg3 arg4=agr4 arg5=arg5 arg6=arg6 arg7=arg7 arg8=arg8 arg9=arg9 arg10=arg10 arg11=arg11 arg1=arg1 arg2=arg2 arg3=arg3 arg4=agr4 arg5=arg5 arg6=arg6 arg7=arg7 arg8=arg8 arg9=arg9 arg10=arg10 arg11=arg11