码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 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” 报错的解决方法

  • 相关阅读:
    使用Docker本地安装部署Drawio绘图工具并实现公网访问
    LeetCode 2 两数相加
    前端成神之路-HTML
    expect脚本中使用普通用户执行sh脚本命令,expect脚本中解决``反引号获取值有问题方法、expect遍历登录不同主机不同密码的主机执行指定命令方法
    特性--反射
    【计算机网络】 TCP和UDP的区别
    Java面试必会高频考题
    HTB靶机064-Arctic-WP
    linux中的tar打包、压缩多个文件、磁盘查看和分区类、du查看文件和目录占用的磁盘空间
    阿里妈妈牟娜:定向广告新一代点击率预估主模型——深度兴趣演化网络
  • 原文地址:https://blog.csdn.net/sy_123a/article/details/126368994
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号