shell 中的小技巧

去掉最后一个字符

  • sed 's/.$//'

  • awk '{sub(/.$/,"")}1'

  • awk '{printf $0" "}'

[root@ ~]# echo "387691,387710,387720,387817,387922,388067,"
387691,387710,387720,387817,387922,388067,
[root@ ~]# echo "387691,387710,387720,387817,387922,388067," | sed 's/.$//'
387691,387710,387720,387817,387922,388067
[root@ ~]# echo "387691,387710,387720,387817,387922,388067," | awk '{sub(/.$/,"")}1'
387691,387710,387720,387817,387922,388067
[root@ ~]# echo "387691,387710,387720,387817,387922,388067," | awk '{printf $0" 
"}'

shell脚本传参小技巧

一般常见的脚本参数传递:./script.sh --argv1=a1 --argv2=a2 或者 ./script.sh -a1 a1 -a2 a2 ,或者两种混用

ParseArguments() {
    while [ $# != 0 ] ; 
    do
        case "$1" in
            -argv1|-a1)
                argv1=$2
                shift 2
                ;;
            --argv1=*)
                argv1=${1#--argv1=}
                shift
                ;;
            -argv2|-a2)
                argv2=$2
                shift 2
                ;;
            --argv2=*)
                argv2=${1#--argv2=}
                shift
                ;;
            -argv3|-a3)
                argv3=$2
                shift 2
                ;;
            --argv3=*)
               argv3=${1#--argv3=}
               shift
               ;;
            *)
               echo "$1 error"
               echo $"$0: Usage: ..."
               exit 1
               ;;
      esac
    done
}

ParseArguments "$@"

对True | False 进行判断的函数

is_true() {
    case "$1" in
        [tT] | [yY] | [yY][eE][sS] | [tT][rR][uU][eE])
            return 0
            ;;
    esac
        return 1
}

is_false() {
    case "$1" in
        [fF] | [nN] | [nN][oO] | [fF][aA][lL][sS][eE])
            return 0
            ;;
    esac
        return 1
}

当is_true函数的第一个参数(后面的参数会忽略掉)为忽略大小写的t、y、yes或true时,返回状态码0,否则返回1。
当is_false函数的第一个参数(后面的参数会忽略掉)为忽略大小写的f、n、no或false时,返回状态码0,否则返回1。

对比两个目录的文件差异

diff <(tree -Ci --noreport d1) <(tree -Ci --noreport d2) 

diff -r d1 d2

vimdiff  <(find d1 -printf "%P
" | sort) <(find d2 -printf "%P
" | sort)

#或者远程比较:
 vimdiff  <(ssh -p 22 -o StrictHostKeyChecking=no 127.0.0.1 "find /tmp/test/t1 -printf '%P
' | sort" 2>/dev/null) <(find /tmp/test/t2 -printf "%P
" | sort)

vimdiff方法可以得到如下截图效果:

一次赋值多个变量

[root@ ]# read a b c <<< $(echo 11 22 33)
[root@ ]# echo $a
11
[root@ ]# echo $b
22
[root@ ]# echo $c
33
原文地址:https://www.cnblogs.com/wshenjin/p/9598028.html