[问题]刚学shell编程,大虾们多多关照,顺便请教个问题

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
lululau
帖子: 105
注册时间: 2007-05-28 11:17
送出感谢: 0
接收感谢: 0

[问题]刚学shell编程,大虾们多多关照,顺便请教个问题

#1

帖子 lululau » 2007-05-31 16:46

这是我们的作业,题目要求:编写一个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!

哪位高手能帮我解释一下?
thword
帖子: 119
注册时间: 2007-04-09 12:19
送出感谢: 0
接收感谢: 0

#2

帖子 thword » 2007-05-31 21:41

问题在于set $newname

这一段改成
if [ $# -eq 0 ]
then
echo -n "请输入一个用户名:"
read newname
fun $newname
else
fun $1
fi
头像
lululau
帖子: 105
注册时间: 2007-05-28 11:17
送出感谢: 0
接收感谢: 0

#3

帖子 lululau » 2007-05-31 23:32

很感谢您的回复,按照您的指点,问题已经解决了,可是我想写得更完善一点,于是改成了这样:

if [ $# -eq 0 ]
then
while [ ! $newname ]
do
echo -n "请输入一个用户名:"
read newname
done
fun $newname
else
fun $1
fi

可是结果又跟上面说的情况一样,这又是为什么?
还有您能不能给我讲解一下我头一次用了set $newmane为什么会不对,谢谢了
thword
帖子: 119
注册时间: 2007-04-09 12:19
送出感谢: 0
接收感谢: 0

#4

帖子 thword » 2007-06-01 10:58

其实主贴中的程序并没有错误。
问题在于你用. filename(而不是sh filename或者./filename)这样的方式执行的。
.命令等价于source命令,它并不像sh filename或者./filename那样启动一个子shell。根据《Advanced Bash-Scripting Guide》,其效果类似于C程序中的#include。
所以你程序中的变量会在程序结束后仍然保留下来。

所以,还是不要养成用“.命令”来执行的习惯。
如果必须要用这种方式执行,那么要在程序结束时,把需要进行条件测试的变量unset掉;或者不要在程序中定义需要进行条件测试的变量(像我前面改的那样)。
上次由 thword 在 2007-06-01 19:12,总共编辑 1 次。
头像
lululau
帖子: 105
注册时间: 2007-05-28 11:17
送出感谢: 0
接收感谢: 0

#5

帖子 lululau » 2007-06-01 17:28

喔~原来是这样,我明白了,谢谢你的指教,万分感谢! :)
头像
lululau
帖子: 105
注册时间: 2007-05-28 11:17
送出感谢: 0
接收感谢: 0

#6

帖子 lululau » 2007-06-01 17:30

也就说保留下来了,但是这个变量还只是对这个文件起作用,应该是这样的吧
thword
帖子: 119
注册时间: 2007-04-09 12:19
送出感谢: 0
接收感谢: 0

#7

帖子 thword » 2007-06-01 19:21

lululau 写了:也就说保留下来了,但是这个变量还只是对这个文件起作用,应该是这样的吧
不是,是当前shell中起作用。
Robinho
帖子: 22
注册时间: 2007-03-01 15:22
来自: 广州
送出感谢: 0
接收感谢: 0

#8

帖子 Robinho » 2007-06-02 20:10

我试了下第一个脚本,shell直接就给我输出一大堆ENV变量了,真ft。
回复

回到 “Shell脚本”