shell 中的小技巧

去掉最后一个字符

  • sed 's/.$//'

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

  • awk '{printf $0"\b \n"}'

[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"\b \n"}'

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\n" | sort) <(find d2 -printf "%P\n" | sort)

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

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

一次赋值多个变量

[root@ ]# read a b c <<< $(echo 11 22 33)
[root@ ]# echo $a
11
[root@ ]# echo $b
22
[root@ ]# echo $c
33

crontab定时清理日期子目录

##例如这样的日期子目录
# ls -l
total 864
drwxrwxr-x 2 root root 77824 Mar 26 22:14 20210319
drwxrwxr-x 2 root root 77824 Mar 27 00:21 20210320
drwxrwxr-x 2 root root 77824 Mar 26 23:36 20210321
drwxrwxr-x 2 root root 77824 Mar 27 09:58 20210322
drwxrwxr-x 2 root root 73728 Mar 28 03:24 20210323
drwxrwxr-x 2 root root 81920 Mar 29 03:25 20210324
drwxrwxr-x 2 root root 81920 Mar 30 03:31 20210325
drwxrwxr-x 2 root root 77824 Mar 30 12:00 20210326
drwxrwxr-x 2 root root 57344 Mar 27 23:59 20210327
drwxrwxr-x 2 root root 57344 Mar 28 23:59 20210328
drwxrwxr-x 2 root root 57344 Mar 29 23:59 20210329
drwxrwxr-x 2 root root 36864 Mar 30 16:32 20210330

##crontab中可以这样写更精确按日期删除:
00 02 * * * od=$(date -d '7 day ago' '+\%Y\%m\%d'); cd /data/logs/ddd/ && find . -maxdepth 1 -type d -name '202?????' -printf '\%f\n' | xargs -i sh -c "[ '{}' -lt $od ] && rm -rf '{}'" >/dev/null 2>&1

获取脚本路径

dirname $(realpath "${BASH_SOURCE[0]}")
posted @ 2018-09-06 14:06  wshenJin  阅读(207)  评论(0编辑  收藏  举报