zzx_shz 发表于 2005-11-19 22:37:20

shell编程中,set命令不能这么使用吗?

我想删除当前目录下文件所有者为指定用户的文件,我使用set命令,因为set命令可以让外部命令的执行结果用位置参数访问。脚本如下:
#!/bin/bash
echo -n "please input username:"
read username
for file in *
do
   if [ -f $file ];then
       set $(ls -l $file)
       #文件的详细信息的第三个字段为文件所有者,第九个字段为文件名。
   owner=$3
       filename=$9
       if [ $owner=$username ];then
             rm -f $filename
       fi
   fi
done
exit 0

可是脚本的执行结果很奇怪,出现一些类似环境变量的信息。文件并没有删除。
请大家帮我看看,哪里出了问题?还是set命令不能这么用?
先谢了!

ivyharry 发表于 2005-11-21 00:40:56

试试sed

ivyharry 发表于 2005-11-21 02:12:52

把你的程序目的和思路说一下
只看你的代码头晕

zzx_shz 发表于 2005-11-21 11:22:48

多谢答复!
别的方法已经实现了,现在我就是想知道这个方法为什么不行?
程序目的在开始已经说了。

sparks 发表于 2005-11-22 16:32:34

set $(ls -l $file)
改为
set -- $(ls -l $file)
就可以了!

set缺省是设置shell变量的
加--选项后,--后的参数才赋值给位置参数

zzx_shz 发表于 2005-11-24 21:14:48

果真通过了。
多谢楼上的指点。

还想再继续追问:为什么我直接在命令行下执行
      #set $(ls -l file_1.sh)
         #name=$3
         #filename=$9
         #echo $name,$filename
就可以得到想要的结果。
以前也碰到过在命令行下执行和执行脚本中的结果不同的情况。为什么会不同呢?

sparks 发表于 2005-11-28 14:32:05

set --设置位置参数是一种有保证的方法,即使位置参数中有以-开头也不会当成选项来处理;不用--的话,假如set后的内容碰巧以-开头的话,就会被当成开关选项,执行时出现你看到的一些奇怪的错误信息,而如果幸运地没有-开头的内容,就会完成正确的设置。
ls -l结果中很容易会以-开头,所以如果不加--来设置的话,很多情况下会出错,而偶尔也会正确,取决于ls -l的输出内容。

on-fire 发表于 2005-12-1 22:16:21

另外的一种思路,请指点。

#!/bin/bash
echo -n "please input username:"
read username
find . -user $username -exec rm -rf {} \;

zzx_shz 发表于 2005-12-3 20:25:09

你的方法更简洁。

我想的是利用awk把ls -l输出中第三个字段和我们要求的用户名相同的文件名输出到一个临时文件tmp1.txt中,此时temp1.txt中保存的就是我们欲删除的文件。
ls -l >tmp.txt
Awk '$3~/'$usrname'/{print $9}'tmp.txt>tmp1.txt


再次感谢sparks。
页: [1]
查看完整版本: shell编程中,set命令不能这么使用吗?