红联Linux门户
Linux帮助

初学shell。有点问题,帮忙看看~~~

发布时间:2011-07-20 14:17:12来源:红联作者:gogo11
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]
文章评论

共有 34 条评论

  1. 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 ] 同理
    所以把变量统一加上双引号是个明智的选择

  2. gogo11 于 2011-07-26 19:29:54发表:

    引用:

    ?我的ibus和gedit兼容性还好,没出过什么问题
    gnome3里的输入法倒是个恶心问题,全局设置ibus也是没用
    打开一些程序还是用所谓的“默认输入法”。。
    age 发表于 2011-7-26 18:58

    记错了,是个leafpad有兼容性问题!

  3. age 于 2011-07-26 18:58:23发表:

    引用:
    centos 6也改用ibus了,看来ibus也不错,不过好像和gedit冲突~~~~~~
    gogo11 发表于 2011-7-26 18:51

    ?我的ibus和gedit兼容性还好,没出过什么问题
    gnome3里的输入法倒是个恶心问题,全局设置ibus也是没用
    打开一些程序还是用所谓的“默认输入法”。。

  4. gogo11 于 2011-07-26 18:51:20发表:

    centos 6也改用ibus了,看来ibus也不错,不过好像和gedit冲突~~~~~~

  5. gogo11 于 2011-07-26 18:50:41发表:

    o(∩∩)o...哈哈

  6. dchwlinux 于 2011-07-26 17:12:14发表:

    29# gogo11

    我只想说,不要再把echo和ls一块儿用了,伤不起啊

  7. 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...

  8. 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),那个+号就是扩展里面的

  9. ljflover 于 2011-07-25 13:00:31发表:

    (6)m:b冒似以有点深度,观望中。。。

  10. shenzhou 于 2011-07-25 12:58:42发表:

    [ $num = 1 ]
    这种写法肯定不对

  11. gogo11 于 2011-07-25 11:24:49发表:

    看看这个结构:

    引用:
    #! /bin/bash

    printf "Enter: "
    read var
    if [[ $var =~ ^[0-9]+$ ]]
    then
    echo "Number."
    elif [[ $var =~ ^[A-Za-z]+$ ]]
    then
    echo "String."
    else
    echo "mixed number and string or others "
    fi

    其中“$var =~ ^[0-9]+$ ”是个什么东西?

  12. gogo11 于 2011-07-25 09:59:26发表:

    [i=s] 本帖最后由 gogo11 于 2011-7-25 10:35 编辑 [/i]

    引用:
    不太明白, 什么叫匹配当前目录.

    dynamips不需要python, 是gns3需要, 因为gns3是用pyqt开发的. windows是把所有文件打包为一个exe. 而linux则是各个包单独安装, 本质上都是一样的.
    age 发表于 2011-7-22 08:37


    比如:
    引用:
    gogo11@localhost:~$ ls -Fal
    总计 448
    drwxr-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/

    我想用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/

  13. wuzen007 于 2011-07-22 22:52:27发表:

    还没学啊,帮不了你

  14. age 于 2011-07-22 11:30:22发表:

    引用:



    恩,还有,现在的=和==在[]里好像也没有区别了,=也可以自动解读为比较是否相等,而不是误读为赋值,难道是两边都空格的作用?
    dchwlinux 发表于 2011-7-22 11:15

    这个倒没注意, 一直用==的, 从c留下来的习惯
    如果=可以的话, 应该是[]作用, 在这里面肯定不是赋值的, 所以会把=解释为==, 不过不算严谨吧.

  15. dchwlinux 于 2011-07-22 11:15:40发表:

    引用:

    python语言也是一样, 对字符和字符串没有区分, 长度为1的字符串就是字符
    可能是因为bash和python这样的都算高级语言, 不要再纠结底层实现了
    age 发表于 2011-7-22 11:01



    恩,还有,现在的=和==在[]里好像也没有区别了,=也可以自动解读为比较是否相等,而不是误读为赋值,难道是两边都空格的作用?

  16. age 于 2011-07-22 11:01:33发表:

    引用:
    对test我只知道最好全用引号,因为我感觉shell里好像没有字符这个概念,只有整数、字符串的概念,所以在shell中引号就意味着字符串,但是在C语言中单引号就意味着是单个字符。shell中单引号意味着纯引用,双的则表示 ...
    dchwlinux 发表于 2011-7-22 10:58

    python语言也是一样, 对字符和字符串没有区分, 长度为1的字符串就是字符
    可能是因为bash和python这样的都算高级语言, 不要再纠结底层实现了

  17. dchwlinux 于 2011-07-22 10:58:44发表:

    [i=s] 本帖最后由 dchwlinux 于 2011-7-22 11:00 编辑 [/i]

    对test我只知道最好全用引号,因为我感觉shell里好像没有字符这个概念,只有整数、字符串的概念,所以在shell中引号就意味着字符串,但是在C语言中单引号就意味着是单个字符。shell中单引号意味着纯引用,双的则表示变量会被替换。甚至我都怀疑,整数比较的过程实质都是字符串比较,整数套单引号都没有问题

    当然,-lt本身要是不接整数的话会报错

  18. age 于 2011-07-22 08:37:58发表:

    不太明白, 什么叫匹配当前目录.

    dynamips不需要python, 是gns3需要, 因为gns3是用pyqt开发的. windows是把所有文件打包为一个exe. 而linux则是各个包单独安装, 本质上都是一样的.

  19. 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...

  20. age 于 2011-07-21 14:39:42发表:

    引用:
    我这个匹配怎么不对?我想匹配当前目录。
    echo `/bin/ls -alF | grep '\.{1}/'`
    shell不用编译!python要编译的~~~~~~~~~
    gogo11 发表于 2011-7-21 14:17

    从哪看来的说法
    python和bash一样, 都是解释型语言, 不用编译的
    所谓编译, 大概是指自动生成的字节码
    这个都是透明的, 和用户无关
    比如你写个bash脚本, 加个x权限, 就可以执行了
    python也是一样, 当然前提是要有python解释器

  21. gogo11 于 2011-07-21 14:17:10发表:

    [i=s] 本帖最后由 gogo11 于 2011-7-21 14:20 编辑 [/i]

    我这个匹配怎么不对?我想匹配当前目录。
    echo `/bin/ls -alF | grep '\.{1}/'`
    shell不用编译!python要编译的~~~~~~~~~

  22. age 于 2011-07-21 13:46:42发表:

    引用:

    错误原因也找到了,shell 中,“-n ”和“-z”是判断是否空字符串的,字符串必须加“”。
    因此,这个应该写为:

    如果不赋值并且没有声明,他就是字符串,郁闷~~~~~~~~


    谢谢age帮我解答!
    gogo11 发表于 2011-7-21 13:21


    所以才觉得bash有点混乱, python在这方面就要好得多
    有空可以学学
    bash能做到的事, python全能做到
    bash做不到的事, python也能做到

  23. gogo11 于 2011-07-21 13:22:39发表:

    引用:
    初学都学的这么有深度。。。我帮不了你啊。。
    siasleo 发表于 2011-7-20 14:53


    这哪是深度,这是基础!

  24. gogo11 于 2011-07-21 13:21:53发表:

    引用:
    [ -n $num ] && echo "the num is $num"
    [ -z $num ] && echo "the num is fdajslfd"

    错误原因也找到了,shell 中,“-n ”和“-z”是判断是否空字符串的,字符串必须加“”。
    因此,这个应该写为:
    引用:
    [ -n "$num" ] && echo "the num is $num"
    [ -z "$num" ] && echo "the num is fdajslfd"

    如果不赋值并且没有声明,他就是字符串,郁闷~~~~~~~~


    谢谢age帮我解答!

  25. 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是错误的~~~~~~~~~~~`
    现在就剩下第一个问题:了
    为什么:

    引用:
    [ -n $num ] && echo "the num is $num"
    [ -z $num ] && echo "the num is fdajslfd"

    两个echo都能打印出来?

  26. age 于 2011-07-21 00:51:27发表:

    引用:


    那你怎么说对方说的是对的,少了一个“=”
    gogo11 发表于 2011-7-21 00:47

    用==号表示相等, 这在很多语言里都是相同的
    但是不代表用法就完全一样了
    在bash里, 字符串比较和数值比较用的比较运算符是完全不一样的
    前者是 ==, !=, 后者则是-gt, -lt之类
    ps: 我也是因为觉得bash里很多用法有点混乱, 所以才改用python的

  27. gogo11 于 2011-07-21 00:47:49发表:

    引用:

    yeah, 少敲了一个=号
    age 发表于 2011-7-20 17:15


    那你怎么说对方说的是对的,少了一个“=”

  28. age 于 2011-07-21 00:34:01发表:

    引用:

    C语言里边判断两个变量是否相等用“==”,我在网上找的shell逻辑运算没有这个比较方式啊!
    他是这样说的

    判断变量是否空值到底怎么回事?上边判断是空,下边判断不是空,两个都对,靠!
    var1=1是字符串
    va ...
    gogo11 发表于 2011-7-20 23:54

    bash本来就不是c, 哪能用c的语法去硬套呢
    用""括起来的就是字符串, 直接写数字的就是数字

  29. gogo11 于 2011-07-20 23:54:39发表:

    引用:

    yeah, 少敲了一个=号
    age 发表于 2011-7-20 17:15

    C语言里边判断两个变量是否相等用“==”,我在网上找的shell逻辑运算没有这个比较方式啊!
    他是这样说的
    引用:
    = 等于 应用于:整型或字符串比较 如果在[] 中,只能是字符串
    != 不等于 应用于:整型或字符串比较 如果在[] 中,只能是字符串

    判断变量是否空值到底怎么回事?上边判断是空,下边判断不是空,两个都对,靠!
    var1=1是字符串
    var2=`expr 1`是数字吗?

  30. 天真花语 于 2011-07-20 19:37:56发表:

    路过,,,,看看。。。学学

  31. age 于 2011-07-20 17:15:22发表:

    引用:
    3楼的 [ $num = "1" ]应该是[ $num == "1" ]吧~?!
    年年年 发表于 2011-7-20 17:05

    yeah, 少敲了一个=号

  32. 年年年 于 2011-07-20 17:05:43发表:

    3楼的 [ $num = "1" ]应该是[ $num == "1" ]吧~?!

  33. age 于 2011-07-20 16:37:44发表:

    [ $num = 1 ]
    这种写法肯定不对
    如果 $num是数字, 那么只能用 -eq, 即[ $num -eq 1 ]
    如果$num是字符, 那么后面的同样为字符, 需要加"", 即[ $num = "1" ]

  34. siasleo 于 2011-07-20 14:53:29发表:

    初学都学的这么有深度。。。我帮不了你啊。。