zoukankan      html  css  js  c++  java
  • Linux shell编程

      1、按行读取文件内容:

      方法1):

    while read line
    do
        echo $line
    done < testfile

      方法2):

    cat testfile | while read line
    do
        echo $line
    done

      使用这种语法时应该注意"跨“进程的问题:如下例,while所在进程是test.sh所在进程的子进程,其对MAX_COST_TIME的修改并未生效!

    # test.sh
    MAX_COST_TIME=0
    cat cost_time.txt | while read COST_TIME
    do
        if [ $COST_TIME -gt $MAX_COST_TIME ]
        then
            MAX_COST_TIME=$COST_TIME
        fi
    done
    
    # 最终MAX_COST_TIME的值还是0
    echo $MAX_COST_TIME

      2、流程控制语句

      1)注意在if语句中,数字使用-gt/-lt/-eq等进行比较,而逻辑运算符使用-a(与)/-o(或)等表示

      3、here文档。在脚本中向命令传递多行输入,就像该命令是在读取文件或键盘输入一样。例子如下:

      1)将指定文本全部转换为大写:

    tr a-z A-z << END_TEXT
    one two three
    four five six
    END_TEXT

      2)输出重定向:

    cat << END_TEXT > testfile
    These sentences will be printed in testfile.
    `date +%Y%m%d`
    END_TEXT

      3)here文档与shell函数:

    ParseText ()
    {
        read line1 && read line2
        echo $line1 $line2
    }
    
    ParseText << END_TEXT
    The first line.
    The second line.
    END_TEXT

      4)多行注释:

    << END_TEXT
    Muti-line notes.
    Muti-line notes.
    END_TEXT
    
    echo "This is the code!"

      4、shell中的运算:

      1)let内建命令:x=5; let "x=$x*5"; echo $x。

      2)双括号形式:echo $((3 * 100 / 26))。注意shell不支持浮点运算。

      3)将十六进制转换为十进制:echo $((16#100)),或echo $((0x123)),或let num=0x123; echo $num

      将十进制转换为十六进制:echo "obase=16;123" | bc ,或echo 100 16 o p |dc

      4)expr命令:

      基本运算:expr 30 * 3(*需要转义); num=13; expr $num / 3

      字符串计算(长度):file=test.txt; len=`expr length "$file"`; echo $len

      字符串计算(子串):file=test.txt; expr substr $file 3 3(结果为st.)

      正则表达式:file=test.txt; expr $file : '.*'(相当于计算字符串长度); expr $file : '(.*).txt'(结果为test)

      5)浮点计算:

    # scale指定保留小数点后多少位
    $ echo "scale=2; 1+2*3-4/5" | bc
    6.20
    
    $ SUM=11
    $ CNT=5
    $ AVG=`awk -v sum=$SUM -v cnt=$CNT 'BEGIN{print sum/cnt }'`
    $ echo $AVG
    2.2

      5、shell中的列表:

      如list=(one two three four)。取列表的第二个元素:echo ${list[1]};计算列表元素的个数:echo ${#list[@]}

      另一种列表赋值的方法:str="one two three four five"; list=($str)

      6、shell函数

      1)参数处理

      (1)getopt(参考自http://blog.linuxeye.com/389.html)。脚本getopt.sh的内容:

    #!/bin/bash
    
    #以下假定运行该脚本的命令是bash getopt.sh -a -b arg0 arg1 arg2 -carg3
    #则$@是"-a -b arg0 arg1 arg2 -carg3"
    #-o指定短选项,--long指定长选项
    #"b:"表示-b之后要带参数,"c::"表示-c之后带的是可选参数
    #"--"有转义的意味,表示后面的字符串不解析为当前命令的选项。如"mkdir -f"是错误的,但"mkdir -- -f"可以创建名为"-f"的目录
    #最后$TEMP的值是"-a -b 'arg0' -c 'arg3' -- 'arg1' 'arg2'"
    TEMP=`getopt -o ab:c:: --long a-long,b-long:,c-long:: -- "$@"`
    
    if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi
    
    #运行该命令后,当前shell环境中$1为"-a"、$2为"-b"、$3为"arg0"...
    eval set -- "$TEMP"
    
    while true
    do
        case "$1" in
            -a | --a-long) echo "option a"; shift ;;
            -b | --b-long) echo "option b, argument $2"; shift 2 ;;
            -c | --c-long)
                case "$2" in
                    "") echo "option c, no argument"; shift 2 ;;
                    *)  echo "option c, argument $2"; shift 2 ;;
                esac ;;
            --) shift ; break ;;
            *)  echo "Internal error!"; exit 1 ;;
        esac
    done
    
    #剩余未匹配到的参数。即$TEMP中"--"之后的部分
    echo "Remaining arguments:"
    for argc
    do
        echo '--> '"$argc";
    done

      (2)getopts

    不断学习中。。。

  • 相关阅读:
    PS转换图片——我教你
    通过Ajax——异步获取相关问题解答
    Spring的线程安全
    Spring MVC的工作机制
    Annotation的语法和使用
    Spring Bean的生命周期
    浅谈Spring
    Spring的事务管理
    行为型模式
    结构型模式
  • 原文地址:https://www.cnblogs.com/hanerfan/p/3364875.html
Copyright © 2011-2022 走看看