Shell编程之参数引用

最近一直在学习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

可以看到当$*没有双引号括起来时其效果跟$@是一样的

你可能感兴趣的:(编程,linux,shell,参数)