• shell脚本 重试 分文件 多进程


    近期写了一个功能较大的脚本,主要涉及知识点如下,以备后续温故知新。

    0:基础知识

    1. //变量声明初始化
    2. i=0
    3. j=2
    4. //更改变量初始值
    5. i=10
    6. j=20
    7. //数值比较
    8. if [[ $i > $j ]];
    9. if (( $i >= $j ));
    10. //数值计算
    11. i=$(($i+1))
    12. j=$(($i+$j))
    13. //逻辑比较
    14. if (( $i >= $j )) && [[ $i == 0 ]];
    15. if [[ ${i} == 1 ]] && [[ ${j} == 1 ]];
    16. //格式化
    17. printf "%04d\n" 2 //0002
    18. //计算列和
    19. ]$ awk -F'\t' '{sum+$5};END{print sum}' file
    20. ]$ awk -F'\t' '{print $5}' file |awk '{sum+=$1};END{print sum}'
    21. //计算指定行和
    22. awk 'NR=3{for(i=1;i<=NF;i++)sum=sum+$i;}END{print sum}'
    23. NF 代表一行有多少个域 (也就是一行有多少个单词)
    24. $NF代表最后一个域 (也就是最后一个单词)
    25. 其他:
    26. ${}:避免变量失效, $a 后如果要加字符,直接写的时候 $ 会辨识不到a ,此时要给a加个{ }, ${a}RMB
    27. $[]: 运算, $[1+1]
    28. $(): 使用命令,a=date:命令直接赋给变量是不可以的,a=$[date],此时是可以赋值给a,用波浪号上的另一个小点符号也可以
    29. $(()):运算
    30. [[ ]]:if比较 注意括号左右边须有空格,如if [[ $size == "" ]];

    1:获取当时执行的时间点信息

    1. ~]$ date //获取 linux 时间戳的命令
    2. Tue Aug 16 16:20:18 CST 2022
    3. //格式化
    4. ~]$ date +"%Y-%m-%d"
    5. 2022-08-16
    6. ~]$ date +"%Y-%m-%d %H:%M:%S"
    7. 2022-08-16 16:23:36
    8. //X.sh 内
    9. curDate1="$(date +"%Y-%m-%d")" //注意双引号
    10. current_time=`date +'%Y-%m-%d %H:%M:%S'` //如果担心双引号过多不好理解,可以用反引号和单引号

    反引号内的语句,在实际脚本执行时会先执行语句,然后反引号外面的语句再操作语句的结果。

    2:逻辑重试,涉及循环

    1. ~]$ seq 5 //默认从1开始遍历到指定数字(包括指定数字),返回一个序列
    2. 1
    3. 2
    4. 3
    5. 4
    6. 5
    7. ~]$ seq 3 5 //指定起始数字
    8. 3
    9. 4
    10. 5

    for 循环

    1. ~]$ for i in $(seq 5); do echo $i; done //in 后面是一个序列,i逐个取值为序列里某个值
    2. 1
    3. 2
    4. 3
    5. 4
    6. 5

    for 循环有一个问题就是,除非遍历完 in 后面的序列,否则无法跳出循环

    1. ~]$ for i in $(seq 5); do $i=10; echo $i; done
    2. bash: 1=10: command not found
    3. 1
    4. bash: 2=10: command not found
    5. 2
    6. bash: 3=10: command not found
    7. 3
    8. bash: 4=10: command not found
    9. 4
    10. bash: 5=10: command not found
    11. 5

    所以重试逻辑还是 while 比较合适。

    while 循环

    while 循环可以在满足一定的条件下,改变循环条件,从而达到跳出循环的目的。

    1. ~]$ i=0; while [ $i -le 3 ]; do i=10; echo $i; done
    2. 10

    3:shell 多进程有坑,需要控制多进程数量

            参见多进程链接,讲解的很好。

            tips:

            3.1:多进程内逻辑过程最好不要带 cat 之类的语句,容易产生『fork: Cannot allocate memory』的问题,因为进程多了本来就占用内存,如果并发的读大文件会导致某时刻内存竞争被 kill 掉。

            待做:

            3.1 shell进程数的产生和原理。

            3.2 shell 多进程中进程限制数目和循环的进程个数之间的关系探讨。

    『shell 注释』:shell 多行注释

    『printf 格式字符串』:shell printf 格式字符串

    『printf』:Shell printf 命令

    『多进程简单 demo』:shell 多进程实现并发

    『shell 中的多进程并发』:

    shell中的多进程并发

    『shell脚本中多线程和控制并发数量』:shell脚本中多线程和控制并发数量(包含同一脚本两个不同的并发数量)

    『fork:Cannot allocate memory』:系统报“fork:Cannot allocate memory” 报错的解决方法

  • 相关阅读:
    vue2项目使用ant design vue组件库table组件时设置column根据接口返回的字段值显示不同内容
    nvidia显卡驱动安装失败怎么办?
    力扣刷题Days3第二题(js)
    LeetCode第二题: 两数相加
    计算机发展简史
    页面置换算法
    MATLAB初学者入门(15)—— 随机森林
    mysql bigInt和hibernate的long类型转换错误
    代码坏味道与重构之霰弹式修改和依恋情结
    基于探针的分布式追踪工具
  • 原文地址:https://blog.csdn.net/sy_123a/article/details/126368994