Chinaunix

标题: shell脚本命令行参数为*的问题 [打印本页]

作者: chencongms    时间: 2013-04-18 14:53
标题: shell脚本命令行参数为*的问题
有个需求,必须要判断用户在使用我的脚本的时候后面的命令行参数是不是“*”
但是我发现不能用if[ "$1" = "*" ]来判断,因为*作为命令行参数会被认为是该目录下的所有文件名,
求大神指导~~
作者: 关阴月飞    时间: 2013-04-18 15:10
*作为命令行参数时,用引号引起来就好了..
作者: chencongms    时间: 2013-04-18 15:34
回复 2# 关阴月飞
不是  我举个例子 rm *   
我要的就是rm *的实际效果 ,但是我要知道后面的命令行参数是不是*

   
作者: chencongms    时间: 2013-04-18 15:36
回复 2# 关阴月飞
不是  我举个例子 rm *   
我要的就是rm *的实际效果 ,但是我要知道后面的命令行参数是不是*

   
作者: 关阴月飞    时间: 2013-04-18 15:39
本帖最后由 关阴月飞 于 2013-04-18 15:40 编辑

回复 3# chencongms
用if 可以直接判断的呀,没有发现你说的问题

  1. [root@localhost awktest]# a=*
  2. [root@localhost awktest]# echo "$a"
  3. *
  4. [root@localhost awktest]# if [ "$a" = "*" ];then
  5. > echo OK
  6. > fi
  7. OK
复制代码

作者: chencongms    时间: 2013-04-18 15:51
回复 5# 关阴月飞


    不是这么回事啊!  你试试rm *
作者: cjaizss    时间: 2013-04-18 16:24
chencongms 发表于 2013-04-18 15:34
回复 2# 关阴月飞
不是  我举个例子 rm *   
我要的就是rm *的实际效果 ,但是我要知道后面的命令行参数 ...

我大致明白你的意思了,如果我没有猜错你的意思的话,那么答案是无法绝对判断
作者: chencongms    时间: 2013-04-18 16:30
cjaizss 发表于 2013-04-18 16:24
我大致明白你的意思了,如果我没有猜错你的意思的话,那么答案是无法绝对判断


谢谢斑竹   我也基本放弃用shell来完成我的目标了  我就是想判断脚本的命令行参数是不是 *
比如
#sh abc.sh * a*
我想知道这个abc.sh脚本在执行的时候后面跟了几个命令行参数 有没有 * 或者 a*
作者: Shell_HAT    时间: 2013-04-18 16:48
照2楼说的加引号

$ cat test.sh
if [[ $1 == "*" ]]; then
    echo yes
else
    echo no
fi
$ ./test.sh "*"
yes

作者: chencongms    时间: 2013-04-18 17:10
回复 9# Shell_HAT


    不是这个意思啊!!  rm "*"  和  rm * 能是一个意思吗?
作者: seesea2517    时间: 2013-04-18 17:25
lz 是没法做了。
这个 * 扩展成当前目录的文件和文件夹是在执行你的脚本之前就做的,所以你在脚本里是看不到 * 的。
作者: Shell_HAT    时间: 2013-04-18 18:12
回复 10# chencongms


    放弃shell之后,你打算如何实现?
作者: ly5066113    时间: 2013-04-18 18:20
印象中有参数可以关闭系统通配。
在执行脚本前先关,取消 * 的通配作用,然后在脚本中判断是否为 * ,再根据需求去开启通配。
作者: 关阴月飞    时间: 2013-04-18 18:49
本帖最后由 关阴月飞 于 2013-04-18 18:58 编辑

回复 13# ly5066113


    在运行脚本的时候, 将参数用引号括起来(或用\*),就已经暂时把 * 的通配符功能关掉了, 然后一个纯 * 字符被传到脚本里去了, 脚本里别的命令调用它,通配功能还是在的。
作者: 关阴月飞    时间: 2013-04-18 18:54
本帖最后由 关阴月飞 于 2013-04-18 18:54 编辑

回复 6# chencongms

好吧,rm * 也是正常的呀:
  1. [root@localhost test]# cat test.sh
  2. #!/bin/bash
  3. cd test
  4. if [ "$1" = "*" ];then

  5.         echo "\$1=$1"
  6.         ls $1
  7.         rm -rf $1
  8. fi
  9. [root@localhost test]# ls
  10. test  test.sh
  11. [root@localhost test]# ls test/
  12. 10.txt  1.txt  2.txt  3.txt  4.txt  5.txt  6.txt  7.txt  8.txt  9.txt
  13. [root@localhost test]# ./test.sh "*"
  14. $1=*
  15. 10.txt  1.txt  2.txt  3.txt  4.txt  5.txt  6.txt  7.txt  8.txt  9.txt
  16. [root@localhost test]# ls test/
  17. [root@localhost test]#
复制代码

作者: chencongms    时间: 2013-04-18 22:36
感谢楼上的各位给我的回复!   特别是@关阴月飞   我第一次看到你这样的做法 我试试
作者: 心若寒江雪    时间: 2013-04-19 01:46
技术上达不到,可以改变一些策略
sh abc.sh * a* ----->> sh abc.sh * a* all
或者这read读取参数之类的
作者: chencongms    时间: 2013-04-19 10:59
回复 15# 关阴月飞


    我不知道我是不是哪写错了
  假设我有多个命令行参数:sh xx.sh a b c *      这里有4个命令行参数:a   b   c  *
我这样写:
#!/bin/sh
for i in $@
do
    if [ "$i" = "*" ];  then
        echo "$i"
    else
        echo "no!"
    fi
done

好像加了引号或者转义字符的*都没用
作者: chencongms    时间: 2013-04-19 11:01
回复 17# 心若寒江雪


    楼上的朋友能说具体点吗  不太懂啊~~~~




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2