这是我们的作业,题目要求:编写一个shell脚本,显示当天日期,查找给定的 某用户是否在系统中工作,如果他在系统中,就发一个问候给他,下面是我写的,文件名叫ex6.10
date '+今天是:%Y年%b %d日'
fun(){
username=$1
count=`who | grep "${username} " | wc -l`
if [ $count -gt 0 ]
then
echo "Hello!${username}!"
else
echo "您输入的用户名不在系统中"
fi
}
echo $1 ###########测试
if [ $# -eq 0 ] ############如果参数个数等于0,那么要求输入用户名
then
echo -n "请输入一个用户名:"
read newname
set $newname
fun $1
else
fun $1
fi
开启一个xterm
输入 # . ex6.10
输出:
今天是:2007年 5月 31日
请输入一个用户名:
输入:root
输出:Hello!root!
OK!到目前为止没有任何问题
那我再试一次:
输入:# . ex6.10
这次就不提示我输入用户名了
输出是:
今天是:2007年 5月 31日
root
Hello!root!
然后我另开一个xterm
输入:# . ex6.10
现在又让我输入用户名了
完成以后,再输入# . ex6.10
输出又是:
今天是:2007年 5月 31日
root
Hello!root!
哪位高手能帮我解释一下?
[问题]刚学shell编程,大虾们多多关照,顺便请教个问题
- lululau
- 帖子: 105
- 注册时间: 2007-05-28 11:17
-
- 帖子: 119
- 注册时间: 2007-04-09 12:19
- lululau
- 帖子: 105
- 注册时间: 2007-05-28 11:17
-
- 帖子: 119
- 注册时间: 2007-04-09 12:19
其实主贴中的程序并没有错误。
问题在于你用. filename(而不是sh filename或者./filename)这样的方式执行的。
.命令等价于source命令,它并不像sh filename或者./filename那样启动一个子shell。根据《Advanced Bash-Scripting Guide》,其效果类似于C程序中的#include。
所以你程序中的变量会在程序结束后仍然保留下来。
所以,还是不要养成用“.命令”来执行的习惯。
如果必须要用这种方式执行,那么要在程序结束时,把需要进行条件测试的变量unset掉;或者不要在程序中定义需要进行条件测试的变量(像我前面改的那样)。
问题在于你用. filename(而不是sh filename或者./filename)这样的方式执行的。
.命令等价于source命令,它并不像sh filename或者./filename那样启动一个子shell。根据《Advanced Bash-Scripting Guide》,其效果类似于C程序中的#include。
所以你程序中的变量会在程序结束后仍然保留下来。
所以,还是不要养成用“.命令”来执行的习惯。
如果必须要用这种方式执行,那么要在程序结束时,把需要进行条件测试的变量unset掉;或者不要在程序中定义需要进行条件测试的变量(像我前面改的那样)。
上次由 thword 在 2007-06-01 19:12,总共编辑 1 次。
-
- 帖子: 119
- 注册时间: 2007-04-09 12:19