gogo11@localhost:~/test$ cat test[code]#!/bin/bash
if [ $# -gt 1 ] ; then
num=1
else
num=""
fi
[ -n $num ] && echo "the num is $num"
[ -z $num ] && echo "the num is fdajslfd"[/code]gogo11@localhost:~/test$ ./test
the num is
the num is fdajslfd
gogo11@localhost:~/test$
无论有没有else;num="",第一个判断都是正确,为什么?[ -n $num ]正确,[ -z $num ]也正确,怎么可能!?
---------------------------------------------------------------------------------
gogo11@localhost:~/test$ cat test[code]#!/bin/bash
if [ $# -gt 1 ] ; then
num=1
else
num=""
fi
[ $num = 1 ] && echo "the num is $num"
[ -z $num ] && echo "the num is fdajslfd"[/code]gogo11@localhost:~/test$ ./test
./test: 第 7 行: [: =: 需要单个参数
the num is fdajslfd
gogo11@localhost:~/test$
第7行:[ $num = 1 ] && echo "the num is $num"
[ $num = 1 ] 格式不对?下边的好像也不对[code]if [ $num = 1 ] ; then
echo "the num is $num"
fi[/code]
yanyongkg 于 2011-08-02 14:23:12发表:
比较字串:[ string1 = string2] 等价于 [ string1 == string2 ]
比较整数:[ num1 -eq num2 ] 等价于 (( num1 == num2 ))
nu=2
[ "$nu" = "2" ] 把整数nu当作字串来比较也是可以的
[ "$nu" == "2" ] 把整数nu当作字串来比较也是可以的
[ "$nu" -eq "2" ]
(( "$nu" == "2" ))
回复一楼的[ -n $num ]与[ -z $num ]
当$num不为空,$num可加双引号也可不加双引号
但$num为空,$num一定要加双引号,原因如下:
num=""
[ -n $num ]的执行过程是先替换变量$num再执行test
也就是变成了[ -n ],这个是个空的test,没被判断是的对象,它的值为真
[ -n "$num" ]替换变量后变成了[ -n "" ],判断是否为非空,这个值当然为假
注意[ -n "" ]与[ -n " " ]是不一样的,后面的为真," "是一个空格字串,它与空值不一样
[ -z $num ] 同理
所以把变量统一加上双引号是个明智的选择
gogo11 于 2011-07-26 19:29:54发表:
记错了,是个leafpad有兼容性问题!
age 于 2011-07-26 18:58:23发表:
?我的ibus和gedit兼容性还好,没出过什么问题
gnome3里的输入法倒是个恶心问题,全局设置ibus也是没用
打开一些程序还是用所谓的“默认输入法”。。
gogo11 于 2011-07-26 18:51:20发表:
centos 6也改用ibus了,看来ibus也不错,不过好像和gedit冲突~~~~~~
gogo11 于 2011-07-26 18:50:41发表:
o(∩∩)o...哈哈
dchwlinux 于 2011-07-26 17:12:14发表:
29# gogo11
我只想说,不要再把echo和ls一块儿用了,伤不起啊
gogo11 于 2011-07-25 17:27:00发表:
[i=s] 本帖最后由 gogo11 于 2011-7-25 17:29 编辑 [/i]
谢谢dchwlinux!我对ls参数不熟悉!
不过还有更纠结的:[code]echo `ls -laF . | grep -n '\./' | grep '^2' |sed 's/2://'`[/code]后来让我优化了:[code]echo `ls -laF . | grep '\ \./'[/code]o(∩∩)o...
dchwlinux 于 2011-07-25 15:01:45发表:
[i=s] 本帖最后由 dchwlinux 于 2011-7-25 15:44 编辑 [/i]
24# gogo11
[i][b]哥,你为什么要这么折腾呢?ls本身就能显示文件了,为什么还要加个echo?ls能显示得那么整齐肯定是用了制表符,但是echo本身显示后有换行功能,所以两个合在一起就乱了。(这是我猜的)
[/i][/b][/b]grep '\.\{1\}/$' [b]搜索的就是“./”,所以../含有“./”也出现了。你想要的结果根本不用grep,ls再加个在参数d就搞定了。
grep '\.\{0,1\}/$‘ 这个更纠结,\.\{0,1\}表示有0个点和1个点,然后以/结尾,也就是说搜索/和./,请问在有F参数的情况下,搜索/不就是显示所有文件吗?
echo `/bin/ls -alF | grep '.x‘`乱?再次声明,是echo不是grep把格式弄乱了,grep只负责过滤,[size=3]原因我只能猜测是排版的问题
[/size]
=~相当于==,只是右边的表达式支持扩展正则表达式(参考egrep),那个+号就是扩展里面的
ljflover 于 2011-07-25 13:00:31发表:
(6)m:b冒似以有点深度,观望中。。。
shenzhou 于 2011-07-25 12:58:42发表:
[ $num = 1 ]
这种写法肯定不对
gogo11 于 2011-07-25 11:24:49发表:
看看这个结构:
其中“$var =~ ^[0-9]+$ ”是个什么东西?
gogo11 于 2011-07-25 09:59:26发表:
[i=s] 本帖最后由 gogo11 于 2011-7-25 10:35 编辑 [/i]
比如:
我想用echo `/bin/ls -alF | grep '\.{1}/'`把drwxr-xr-x 56 gogo11 gogo11 4096 2011-07-25 07:56 ./这行挑出来。
echo `/bin/ls -alF | grep '\.\{1\}/$'`也不对,把./ 和../都挑出来了
为什么echo `/bin/ls -alF | grep '\.\{0,1\}/$'`会把所有目录和文件都搞出来,好像没有筛选一样,不是都加了转义符号了么?
至于dynamips用python是因为上次用archlinux的时候,启动这个程序,说找不到python,后来在/lib里边找到了一个但是目录和要求的不一样,我用ln -s 链接了目录后,就能启动。但是也不正常,就又装了lubuntu~~~~~~~~~
还有,用echo `/bin/ls -alF | grep '.x‘`怎么格式乱了。本来/bin/ls -alF 还是一行一项的,经过grep怎么乱套了,成下边那样了:
rwxr-xr-x 56 gogo11 gogo11 4096 2011-07-25 07:56 ./ drwxr-xr-x 4 root root 4096 2011-06-03 20:26 ../ drwx------ 2 gogo11 gogo11 4096 2011-06-04 09:57 .AbiSuite/ drwx------ 2 gogo11 gogo11 4096 2011-06-07 15:14 .abuse/ drwx------ 5 gogo11 gogo11 4096 2011-06-03 18:40 .adobe/ drwxr-xr-x 4 gogo11 gogo11 4096 2011-07-05 11:52 .aMule/ drwx------ 2 gogo11 gogo11 4096 2011-06-04 11:56 .aqualung/
wuzen007 于 2011-07-22 22:52:27发表:
还没学啊,帮不了你
age 于 2011-07-22 11:30:22发表:
这个倒没注意, 一直用==的, 从c留下来的习惯
如果=可以的话, 应该是[]作用, 在这里面肯定不是赋值的, 所以会把=解释为==, 不过不算严谨吧.
dchwlinux 于 2011-07-22 11:15:40发表:
恩,还有,现在的=和==在[]里好像也没有区别了,=也可以自动解读为比较是否相等,而不是误读为赋值,难道是两边都空格的作用?
age 于 2011-07-22 11:01:33发表:
python语言也是一样, 对字符和字符串没有区分, 长度为1的字符串就是字符
可能是因为bash和python这样的都算高级语言, 不要再纠结底层实现了
dchwlinux 于 2011-07-22 10:58:44发表:
[i=s] 本帖最后由 dchwlinux 于 2011-7-22 11:00 编辑 [/i]
对test我只知道最好全用引号,因为我感觉shell里好像没有字符这个概念,只有整数、字符串的概念,所以在shell中引号就意味着字符串,但是在C语言中单引号就意味着是单个字符。shell中单引号意味着纯引用,双的则表示变量会被替换。甚至我都怀疑,整数比较的过程实质都是字符串比较,整数套单引号都没有问题
当然,-lt本身要是不接整数的话会报错
age 于 2011-07-22 08:37:58发表:
不太明白, 什么叫匹配当前目录.
dynamips不需要python, 是gns3需要, 因为gns3是用pyqt开发的. windows是把所有文件打包为一个exe. 而linux则是各个包单独安装, 本质上都是一样的.
gogo11 于 2011-07-22 00:52:41发表:
[i=s] 本帖最后由 gogo11 于 2011-7-22 01:09 编辑 [/i]
echo `/bin/ls -alF | grep '\.{1}/'`
怎么不对啊?
至于python是否是要编译,那是我猜的。因为linux下得dynamips需要python,而windows下的是个可执行文件,并且没有说要这个python,我想应该是编译过的。所以,就这样了,o(∩_∩)o...
age 于 2011-07-21 14:39:42发表:
从哪看来的说法
python和bash一样, 都是解释型语言, 不用编译的
所谓编译, 大概是指自动生成的字节码
这个都是透明的, 和用户无关
比如你写个bash脚本, 加个x权限, 就可以执行了
python也是一样, 当然前提是要有python解释器
gogo11 于 2011-07-21 14:17:10发表:
[i=s] 本帖最后由 gogo11 于 2011-7-21 14:20 编辑 [/i]
我这个匹配怎么不对?我想匹配当前目录。
echo `/bin/ls -alF | grep '\.{1}/'`
shell不用编译!python要编译的~~~~~~~~~
age 于 2011-07-21 13:46:42发表:
所以才觉得bash有点混乱, python在这方面就要好得多
有空可以学学
bash能做到的事, python全能做到
bash做不到的事, python也能做到
gogo11 于 2011-07-21 13:22:39发表:
这哪是深度,这是基础!
gogo11 于 2011-07-21 13:21:53发表:
错误原因也找到了,shell 中,“-n ”和“-z”是判断是否空字符串的,字符串必须加“”。
因此,这个应该写为:
如果不赋值并且没有声明,他就是字符串,郁闷~~~~~~~~
谢谢age帮我解答!
gogo11 于 2011-07-21 11:33:31发表:
[i=s] 本帖最后由 gogo11 于 2011-7-21 11:42 编辑 [/i]
发现了一个原因,如果$num是空,[ $num == "123" ]就是错误的,说“需要单个参数”,如果非空,这个比较就是正确的,靠!
cat ./test[code]#!/bin/bash
if [ $# -gt 1 ] ; then
num="2"
else
num=""
#num=123
fi
echo $num
if [ $num == "123" ]
then
echo "the num is $num"
else
echo "the num is good"
fi[/code]也就是说./test fdjas fjalsdf 是正确的;而./test是错误的~~~~~~~~~~~`
现在就剩下第一个问题:了
为什么:
两个echo都能打印出来?
age 于 2011-07-21 00:51:27发表:
用==号表示相等, 这在很多语言里都是相同的
但是不代表用法就完全一样了
在bash里, 字符串比较和数值比较用的比较运算符是完全不一样的
前者是 ==, !=, 后者则是-gt, -lt之类
ps: 我也是因为觉得bash里很多用法有点混乱, 所以才改用python的
gogo11 于 2011-07-21 00:47:49发表:
那你怎么说对方说的是对的,少了一个“=”
age 于 2011-07-21 00:34:01发表:
bash本来就不是c, 哪能用c的语法去硬套呢
用""括起来的就是字符串, 直接写数字的就是数字
gogo11 于 2011-07-20 23:54:39发表:
C语言里边判断两个变量是否相等用“==”,我在网上找的shell逻辑运算没有这个比较方式啊!
他是这样说的
判断变量是否空值到底怎么回事?上边判断是空,下边判断不是空,两个都对,靠!
var1=1是字符串
var2=`expr 1`是数字吗?
天真花语 于 2011-07-20 19:37:56发表:
路过,,,,看看。。。学学
age 于 2011-07-20 17:15:22发表:
yeah, 少敲了一个=号
年年年 于 2011-07-20 17:05:43发表:
3楼的 [ $num = "1" ]应该是[ $num == "1" ]吧~?!
age 于 2011-07-20 16:37:44发表:
[ $num = 1 ]
这种写法肯定不对
如果 $num是数字, 那么只能用 -eq, 即[ $num -eq 1 ]
如果$num是字符, 那么后面的同样为字符, 需要加"", 即[ $num = "1" ]
siasleo 于 2011-07-20 14:53:29发表:
初学都学的这么有深度。。。我帮不了你啊。。