• 1. shell 简明教程


    TOC

    1.变量运算

    特殊变量

    $0:当前脚本变量名字

    $n:传入脚本或函数的第几个参数

    $#:传输脚本或函数的参数个数

    $*:传给脚本或函数的所有参数

    $@:传给脚本或函数的所有参数

    $?:上一个命令的返回值

    $$: 当前shell 进程ID

    测试脚本

    #!/bin/bash
    
    
    a=20
    b=10
    
    
    val=$(expr ${a} + ${b})
    echo ${val}
    
    
    val=$(expr ${a} - ${b})
    echo ${val}
    
    
    val=$(expr ${a} * ${b})
    echo ${val}
    
    
    val=$(expr ${a} / ${b})
    echo ${val}
    
    
    val=$(expr ${a} % ${b})
    echo ${val}
    
    
    if [ ${a} == ${b} ];then
        echo "a == b"
    fi
    
    
    if [ ${a} != ${b} ];then
        echo "a != b"
    fi
    
    

    测试脚本

    #!/bin/bash
    
    
    name1="mark"
    name2="mark"
    
    
    age1=22
    age2=22
    
    
    #字符串比较使用 = or !=
    if [ ${name1} = ${name2} -a ${age1} -eq ${age2} ];then
        echo "a == b"
    else
        echo "a != b"
    fi
    
    

    测试脚本

    #!/bin/bash
    
    
    a="abc"
    b="123"
    
    
    if [ $a = $b ];
    then
        echo "$a = $b : a is equal to b"
    else
        echo "$a = $b: a is not equal to b"
    fi
    
    
    if [ $a != $b ];
    then
        echo "$a != $b : a is not equal to b"
    else
        echo "$a != $b: a is equal to b"
    fi
    
    
    if [ -z $a ];
    then
        echo "-z $a : string length is zero"
    else
        echo "-z $a : string length is not zero"
    fi
    
    
    if [ -n $a ];
    then
        echo "-n $a : string length is not zero"
    else
        echo "-n $a : string length is zero"
    fi
    
    
    if [ $a ];
    then
        echo "$a : string is not empty"
    else
        echo "$a : string is empty"
    fi
    
    

    测试脚本

    #!/bin/bash
    
    
    file="test.txt"
    
    
    if [ -r $file ]
    then
        echo "File has read access"
    else
        echo "File does not have read access"
    fi
    if [ -w $file ]
    then
        echo "File has write permission"
    else
        echo "File does not have write permission"
    fi
    if [ -x $file ]
    then
        echo "File has execute permission"
    else
        echo "File does not have execute permission"
    fi
    if [ -f $file ]
    then
        echo "File is an ordinary file"
    else
        echo "This is sepcial file"
    fi
    if [ -d $file ]
    then
        echo "File is a directory"
    else
        echo "This is not a directory"
    fi
    if [ -s $file ]
    then
        echo "File size is zero"
    else
        echo "File size is not zero"
    fi
    if [ -e $file ]
    then
        echo "File exists"
    else
        echo "File does not exist"
    fi
    
    

    2.条件分支语句

    if elif else

    
    compare()
    {
        if [ $1 -eq $2 ];then
            echo $1 "==" $2
        elif [ $1 -lt $2 ];then
            echo $1 "<" $2
        else
            echo $1 ">" $2
        fi
    
    
    }
    
    
    compare 1 1
    compare 1 2
    compare 2 1
    
    

    case esac

    
    chose()
    {
        case $1 in
            1)
                echo "step 1"
                ;;
            2)
                echo "step 2"
                ;;
            *)
                echo "error"
                ;;
        esac
    }
    
    
    chose 1
    chose 2
    chose 4
    
    

    3.循环语句

    #!/bin/bash
    
    
    for_loop()
    {
        for val in $*
        do
            echo ${val}
        done
    }
    
    
    
    for_loop this is my program
    
    
    for_num()
    {
        for((i=1; i < 5; i++))
        do
            echo ${i}
        done
    }
    
    
    for_num
    
    
    
    while_loop()
    {
        i=0
        while [[ $i < 5 ]]
        do
            echo "step " ${i}
            ((i=i+2))
        done
    
    
    }
    
    
    while_loop
    
    

    4.函数

    #!/bin/bash
    
    
    Hello()
    {
        echo "Hello World"
    }
    
    
    Hello
    
    
    Print()
    {
        echo "Print: " ${1} ${2}
    }
    
    
    #函数传参数
    Print Hello World
    
    
    #函数返回值
    Sum()
    {
        val=$(expr $1 + $2)
    
    
        return ${val}
    }
    
    
    Sum 1 2
    #$? 返回值
    val=$?
    
    
    echo "val = " ${val}
    
    

    5.read 使用

    • 遍历文件

    student.info

    mark:22
    lisa:22
    dark:23

    测试脚本

    #!/bin/bash
    
    
    #遍历文件
    while read line
    do
      echo ${line}
    done < student.info
    
    
    #遍历文件
    cat student.info | while read line
    do
        echo ${line}
    done
    
    
    #获取变量, IFS表示分隔符
    while IFS=: read name age
    do
        echo ${name} ${age}
    done < student.info

    6.sort 使用

    7.grep 使用

    • 常用参数
      -i:忽略大小写
      -n:显示行数
      -r:搜索目录,不指定的话,目录不搜索
      -v:选择不配的行
      -c:计算符合样式的行数
      -w:全词匹配

    8.sed 使用

    测试文本pets

    This is my cat
    my cat's name is betty
    This is my dog
    my dog's name is frank
    This is my fish
    my fish's name is george
    This is my goat
    my goat's name is adam
    • 替换my为your
    $sed -i 's/my/your/g' petsThis is your cat
    your cat's name is betty
    This is your dog
    your dog's name is frank
    This is your fish
    your fish's name is george
    This is your goat
    your goat's name is adam
    • 行首添加#
    $sed 's/^/#/g' pets#This is my cat
    #my cat's name is betty
    #This is my dog
    #my dog's name is frank
    #This is my fish
    #my fish's name is george
    #This is my goat
    #my goat's name is adam
    
    
    • 行尾添加#
    $sed 's/$/#/g' petsThis is my cat#
    my cat's name is betty#
    This is my dog#
    my dog's name is frank#
    This is my fish#
    my fish's name is george#
    This is my goat#
    my goat's name is adam#
    
    
    • 1到3行的my替换为your
    $sed '1,3s/my/your/g' petsThis is your cat
    your cat's name is betty
    This is your dog
    my dog's name is frank
    This is my fish
    my fish's name is george
    This is my goat
    my goat's name is adam
    
    
    • 只替换每一行的第一个i
    $sed -i 's/i/I/1' petsThIs is my cat
    my cat's name Is betty
    ThIs is my dog
    my dog's name Is frank
    ThIs is my fish
    my fIsh's name is george
    ThIs is my goat
    my goat's name Is adam
    
    
    • 只替换每一行的第二个以后的i
    $sed 's/i/I/2g' petsThis Is my cat
    my cat's name is betty
    This Is my dog
    my dog's name is frank
    This Is my fIsh
    my fish's name Is george
    This Is my goat
    my goat's name is adam
    
    
    • 一次使用多次匹配模式
    $sed '1,3s/my/your/g ; 4,$s/my/her/g' petsThis is your cat
    your cat's name is betty
    This is your dog
    her dog's name is frank
    This is her fish
    her fish's name is george
    This is her goat
    her goat's name is adam
    
    
    • i 命令插入一行
    $sed '1 i This is my monkey' petsThis is my monkey
    This is my cat
    my cat's name is betty
    This is my dog
    my dog's name is frank
    This is my fish
    my fish's name is george
    This is my goat
    my goat's name is adam
    
    
    • a 命令插入一行
    $sed '1 a This is my monkey' petsThis is my cat
    This is my monkey
    my cat's name is betty
    This is my dog
    my dog's name is frank
    This is my fish
    my fish's name is george
    This is my goat
    my goat's name is adam
    
    
    • c 替换一行
    $sed '1 c This is my monkey' petsThis is my monkey
    my cat's name is betty
    This is my dog
    my dog's name is frank
    This is my fish
    my fish's name is george
    This is my goat
    my goat's name is adam
    
    
    • d 删除一行
    $sed '2d' petsThis is my cat
    This is my dog
    my dog's name is frank
    This is my fish
    my fish's name is george
    This is my goat
    my goat's name is adam
    • 匹配删除行
    $sed '/This/d' petsmy cat's name is betty
    my dog's name is frank
    my fish's name is george
    my goat's name is adam
    
    

    9.awk 使用

    内建变量
    $0:当前记录(这个变量中存放着整个行的内容)
    $1-$n:当前记录的第n个字段,字段间由FS分隔
    NF:当前记录中的字段个数,就是有多少列
    NR:已经读出的记录数,就是行号,从1开始,如果有多个文件话,这个值也是不断累加中。
    FNR:当前记录数,与NR不同的是,这个值会是各个文件自己的行号
    RS:输入字段分隔符 默认是空格或Tab
    FS:输入的记录分隔符, 默认为换行符
    ORS:输出字段分隔符, 默认也是空格
    OFS:输出的记录分隔符,默认为换行符
    FILENAME:当前输入文件的名字

    AWK 脚本

    • BIGIN{这里面放的是执行前的语句}
    • END{这里面放的是执行后的语句}
    • {这里面放的是处理每一行需要执行的语句}

    学生成绩表score

    Marry   2143 78 84 77
    Jack    2321 66 78 45
    Tom     2122 48 77 71
    Mike    2537 87 97 95
    Bob     2415 40 57 62

    awk 脚本

    #!/bin/awk -f
    #运行前
    BEGIN {    math = 0    english = 0    computer = 0     printf "NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL
    "    printf "---------------------------------------------
    "}
    #运行中
    {    math+=$3    english+=$4    computer+=$5    printf "%-6s %-6s %4d %8d %8d %8d
    ", $1, $2, $3,$4,$5, $3+$4+$5}
    #运行后END
    {    printf "---------------------------------------------
    "    printf "  TOTAL:%10d %8d %8d 
    ", math, english, computer    printf "AVERAGE:%10.2f %8.2f %8.2f
    ", math/NR, english/NR, computer/NR}

    10.获取当前脚本所在的绝对路

    一般脚本

    DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

    链接文件脚本

    SOURCE="${BASH_SOURCE[0]}"while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink  DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"  SOURCE="$(readlink "$SOURCE")"  [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was locateddoneDIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"

    参考:http://blog.csdn.net/weijinhua_123/article/details/53152411

    11. 批量替换文件里面的内容

    find . -name "*.c" | xargs grep "a_string" -l| xargs sed -i "s/a_string/b_string/g"

    12. 如何判断一个变量是否被赋值

    变量通过" "引号引起来

    #!/bin/sh
    para1=
    if [ ! -n "$para1" ]; then
      echo "IS NULL"
    else
      echo "NOT NULL"
    fi

    直接通过变量判断

    #!/bin/sh
    para1=
    if [ ! $para1 ]; then
      echo "IS NULL"
    else
      echo "NOT NULL"
    fi

    使用test判断

    #!/bin/sh
    dmin=
    if test -z "$dmin"
    then
      echo "dmin is not set!"
    else 
      echo "dmin is set !"
    fi

    使用""判断

    #!/bin/sh
    dmin=
    if [ "$dmin" = "" ]
    then
      echo "dmin is not set!"
    else 
      echo "dmin is set !"
    fi
  • 相关阅读:
    常用正则表达式
    java中的异或运算
    Eclipse 中,web项目在Tomcat运行时填写不了Server name
    错误: 找不到或无法加载主类 tomcat-juli.jar
    Hadoop学习之Ubuntu12.04 Hadoop 环境搭建笔记
    ubuntu安装 cober 笔记
    Ubuntu中安装JDK
    对象调用很容易忽视的地址问题
    2018.09.27_练习时的tips
    网页的组成(一)
  • 原文地址:https://www.cnblogs.com/standardzero/p/12552996.html
Copyright © 2020-2023  润新知