这两天闲着,玩一下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在传递参数时,对某些特殊字符做了处理,使它们不能直接作为参数,这也许很正常。我大概是没看源码,不知道规则,大惊小怪而已。