zoukankan      html  css  js  c++  java
  • shell里的` ` $( ) ${ } expr $(( ))

    转自:http://blog.sina.com.cn/s/blog_6151984a0100ekz2.html

    所有UNIX命令,要取结果或输出,都要用$( )或反引号` `

    tt=` file test.sh `
    echo $tt
    #sh test.sh
    test.sh: ASCII text

    tar -zcvf lastmod.tar.gz `find . -mtime -1 -type f -print`
    将过去24小时(-mtime –2则表示过去48小时)内修改过的文件tar在一起

        反引号`  `和$( )缺陷也相同,没回车换行,容易把多行合并
    [mac@machome ~]$ vi test.sh

    echo `ps -ef | grep syslog` 
    [mac@machome ~]$ sh test.sh
    root 1363 1 0 12:15 ? 00:00:00 syslogd -m 0 mac 15032 15030 0 18:13 pts/2 00:00:00 grep syslog

    [macg@machome ~]$ vi test.sh

    var=$(ls -l)
    echo $var
    [macg@machome ~]$ sh test.sh
    total 44 -rw-rw-r-- 1 macg macg 126 Jun 8 23:40 1 -rw-rw-r-- 1 macg macg 0 Jun 8 17:53 100 -rw-rw-r-- 1 macg macg 16 Jun 9 19:00 111.txt -rw-rw-r-- 1 macg macg 15 Jun 9 19:00 22.txt -rw-rw-r-- 1 macg macg 15 Jun 9 19:00 33.txt -rw-rw-r-- 1 macg macg 23 Jun 12 19:20 test.sh

        wc-l常与$( )合用取其输出,计算行数,进而确定循环次数
    count=$(more iftmp|wc -l)
    while [ $i -le $count ]


        echo +$(  ) ――echo内也可执行命令,并通过$( )取该命令的输出再显示
    常见使用:echo内,用$( )取awk和sed对某些命令修饰后的效果
    [macg@machome ~]$ vi test
    #choose a iinterface to config
    /sbin/ifconfig -a | awk '$2=="Link" {print($1,$3)}' >iftmp
    echo "choose one of interface to config"
    i=1
    count=$(more iftmp|wc -l)
    while [ $i -le $count ]
    do
    echo "$i)-------- $(sed -n "${i}p" iftmp)"
                      用sed 修饰输出
    ii=$(($i+1))
    done   
    [macg@machome ~]$ sh test

    choose one of interface to config
    1)-------- eth0 encap:Ethernet
    2)-------- lo encap:Local
    3)-------- sit0 encap:IPv6-in-IPv4
    give the interface a host name[such as:xxx-hme0]:

        ${ }和$( )的区别:${ }  是做什么用的? --------避免在echo中变量被连读
        ${i}是区分其后紧接的字符串,避免“连读”
    $ vi ttt.sh

    GONE="(ServerType|BindAddress|Port|AddModule|ClearModuleList|"
    GONE="${GONE}AgentLog|RefererLog|RefererIgnore|FancyIndexing|"
    echo $GONE
    $ sh ttt.sh
    (ServerType|BindAddress|Port|AddModule|ClearModuleList|AgentLog|RefererLog|RefererIgnore|FancyIndexing
     

        ${i}可以在任何场合替代普通变量$i
    ttt=${REMOTEHOST}
    echo ${ttt}
    ttt=$REMOTEHOST
    echo $ttt
    [macg@localhost ~]$ sh ttt.sh
    192.168.1.11    
    [macg@localhost ~]$ sh ttt.sh
    192.168.1.11

        expr   数学表达式
    shell语言里没有运算公式,必须借助expr语句实现:
    expr 变量 +-x / 变量 expr $a '+' $b
    expr 常数 +-x / 常数 [mac@machome ~]$ expr 3 '+' 2
    5
    运算符号都要加引号,单引号双引号均可
    输出是结果


        为什么if expr 3 '+' 2 得5,但if仍走then ? 非0应该走else啊
    因为expr表达式返回的是"返回值",不是"结果"
    [mac@machome ~]$ vi test.sh
    expr 3 '+' 2
    echo $?
    [mac@machome ~]$ sh test.sh
                      输出5
                      返回0       只要加法成功,返回值就是0,0为真
       
        expr 表达式计算完后如何获得结果?——用 $(expr  … ) 或反引号` expr  …`
    其实就是取其输出,expr的输出就是结果
    var = expr $a '+' $b
    echo "final is $var"
    var=$(expr $a '+' $b)
    echo "final is $var"
    test.sh: line 7: var: command not found  
    加法完成后结果赋值出错
    final is  
    final is 7

       
        expr在if语句里,不能用 [ ],因为这里把它当作command
    [mac@machome ~]$ vi test.sh
    if [ expr 3 '+' 2 ] ; then
    echo no5
    else
    echo is5
    fi
    [mac@machome ~]$ sh test.sh
    test.sh: line 1: [: too many arguments
    is5   
    改成
    [mac@machome ~]$ vi test.sh
    if  expr 3 '+' 2  ; then               expr 3 '+' 2相当于command
    echo no5
    else
    echo is5
    fi
    [mac@machome ~]$ sh test.sh
    5
    no5
                                                                              
    不过如果要进行结果判定,加$(),就必须用[ ]了,因为把它当作表达式了
    [macg@machome ~]$ vi test.sh
    if [ $(expr 3 '+' 2) != 5 ];then           而且[和$中间必须有空格
    echo no5
    else
    echo is5
    fi
    [macg@machome ~]$ sh test.sh
    is5


        另一种运算格式i++如何实现?------ i=$(($i+1))
    while [ $i -le $count ]
    do
    command
    i=$(($i+1))
    done


      (( ))与[ ]作用完全相同
    echo input:
    read i
    i=$(($i+1))
    echo $i    
    echo input:
    read i
    i=$[$i+1]
    echo $i
    [macg@localhost ~]$ sh ttt.sh
    input:
    6
      
    [macg@localhost ~]$ sh ttt.sh
    input:
    6
    7


        反面证明(( ))与[ ]完全相同--------if (( ))
    if (( $# != 3 )); then
     echo "usage: $0 host user passwd"
    fi
    if [ $# != 3 ]; then
     echo "usage: $0 host user passwd"
    fi
    [macg@localhost ~]$ sh ttt.sh 1 2
    usage: ttt.sh host user passwd
    [macg@localhost ~]$ sh ttt.sh 1 2
    usage: ttt.sh host user passwd

  • 相关阅读:
    nginx 优化
    linux 内核的优化
    Linux下如何查看版本
    oracle安装数据库中文乱码解决办法
    Python 5 行代码的神奇操作
    Python爬取网站上面的数据很简单,但是如何爬取APP上面的数据呢
    解放双手!用 Python 控制你的鼠标和键盘
    js混淆、eval解密
    ubuntu
    爬虫基本原理
  • 原文地址:https://www.cnblogs.com/alan666/p/8312041.html
Copyright © 2011-2022 走看看