日期:2014-05-16  浏览次数:20654 次

请问如何将[ab]原封不动的传给Shell脚本?
这样一个叫s.sh的脚本:
#! /bin/ksh 
echo $1
怎样才能让它的输出结果为[ab]? 
试过了下面这些都不行:
./s.sh [ab]
./s.sh \[ab]
./s.sh '[ab]'
./s.sh '\[ab]'
结果不是a就是\[ab]。

求高手指点!

------解决方案--------------------
./s.sh "[ab]"

记住,shell解析命令前将转义一次""或者不带""的部分, 将不转义''包裹的部分,另外,[]这些符号影响命令解析,必须"",''包裹,具体转义问题自己考虑。


------解决方案--------------------
你确定? 

我bashshell没这个毛病,通配符和正则都是程序解析的,不是shell解析的。
------解决方案--------------------
LZ估计是solaris系统,用了ksh,跟bash有点不一样
多试试转义之类的方法吧
------解决方案--------------------
\[ab\]
------解决方案--------------------
centos用/bin/bash,毫无问题啊,我不试验一下是不会回复你的。

C/C++ code
[User:root Time:18:43:13 Path:/home/liangdong/shell]$ cat test.sh 
#!/bin/sh 

echo $1;
[User:root Time:18:43:15 Path:/home/liangdong/shell]$ ./test.sh [ab]
[ab]
[User:root Time:18:43:19 Path:/home/liangdong/shell]$

------解决方案--------------------
$ cat cmd.ksh
#!/bin/ksh

print $1;
$ ./cmd.ksh "[ab]"
[ab]


------解决方案--------------------
貌似所有情况都行啊:

Perl code

zhu@ubuntu:~/sed$ cat cmd.ksh 
#!/bin/ksh
echo $1;
zhu@ubuntu:~/sed$ ./cmd.ksh [ab]
[ab]
zhu@ubuntu:~/sed$ ./cmd.ksh '[ab]'
[ab]
zhu@ubuntu:~/sed$ ./cmd.ksh "[ab]"
[ab]
zhu@ubuntu:~/sed$ uname -a
Linux ubuntu 3.2.0-24-generic #39-Ubuntu SMP Mon May 21 16:52:17 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
zhu@ubuntu:~/sed$ dpkg -l|grep ksh
ii  ksh                                    93u-1                                   The real, AT&T version of the Korn shell
zhu@ubuntu:~/sed$

------解决方案--------------------
探讨

重新看了下书,关于执行顺序的部分,有这么一段:
“9.对于*、?,以及一对[...]的任何出现次数,都执行文件名生成(filename generation)的操作,也就是通配符展开。”

终于知道为什么结果是a了,因为我的当前目录下恰好有个叫a的文件。删了之后,./sh [ab]就能得到想要的结果。
引用的那段应该是跟shell的具体种类无关的。楼上可以在当前目录下建个叫a或者b的文件……

------解决方案--------------------
虽然你执行时参数使用了引号,但是你脚本中的输出语句是echo $1,其中的$1是没有引号的

你可以改为这样看看
echo "$1"

这样,./s.sh '[ab]'
就会输出[ab]了

不管你当前目录下有没有a或b文件