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 @   wshenJin  阅读(212)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
点击右上角即可分享
微信分享提示