shell参数中的特殊字符

这两天闲着,玩一下NB,从Shell下手,碰到点有意思的,顺便记下。

写了个简单的脚本test_2,输出用户的参数:
#!/bin/sh
if [ $# -lt 2 ] ; then
 echo "You need 2 paramerters at less!"
 exit 0
fi
ONE="$1"
TWO="$2"
echo "Your paramerters are:"
echo $1
echo $2

:wq保存;
chmod +x test_2 使其可执行

发现了一点有趣的,不同参数的执行结果:
(1)无参数:
#./test_2
You need 2 paramerters at less!

(2)
#./test_2 /43 ./#$@&
#Your paramerters are:
/43
./#

---------------------------------------------------------------
没有出现提示符,似乎该命令还没有执行完
/*
 *猜测可能是因为最后一个字符“&”有什么特别含义,暂不清楚
 */
直接回车:
[1] Done ./test_2 /43 ./#${@}


(3)
#./test_2 /43 ./#$@
#Your paramerters are:
/43
./#
#

----------------------------------------------------------------
和上次输出一样,不过出现命令提示符,说明命令已执行完毕


(4)
#./test_2 /43 ./#$
#Your paramerters are:
/43
./#$
#

----------------------------------------------------------------
好像是正常的输出,去掉一个“@”就正常了,奇怪。


(5)
#./test_2 /43 ./#
#Your paramerters are:
/43
./#
#

----------------------------------------------------------------
还是正常的。
“./test_2 /43 ./” 与“./test_2 /43 .”均正常。


(6)
#./test_2 /43 ./#$&
#Your paramerters are:
/43
./#$

-----------------------------------------------------------------
一样没有出现提示符,“./test_2 /43 ./#$”则正常。似乎可以作此结论:“&”等待用户输入才能继续执行,至于要输入什么,不得而知。



(7)
#./test_2 /43 ./$@
#Your paramerters are:
/43
./
#
-----------------------------------------------------------------
与情况(3)对比,似乎可以发现“$@”被忽略了。


(8)
#./test_2 /43 ./$4@
#Your paramerters are:
/43
./@
#
-----------------------------------------------------------------
太奇怪了,头都大了。

这东西,我估计是shell在传递参数时,对某些特殊字符做了处理,使它们不能直接作为参数,这也许很正常。我大概是没看源码,不知道规则,大惊小怪而已。

posted @ 2008-10-10 17:47    阅读(796)  评论(0编辑  收藏  举报