zoukankan      html  css  js  c++  java
  • 学习助手开发4——实现完成事项的功能

    项目地址: https://github.com/Zeraka/mytodolisthelper

    todolist里的计划完成,需要将notdone,替换为done
    初步思路是设计一个脚本,该脚本将具体某一行的notdone字符串替换为done字符串。

    首先是要知道每行事务的行数。指令使用 grep -n即可。可得到如下消息

    12:类继承       2020-09-22 12:07:22     notdone
    13:类继承       2020-09-22 18:07:22     notdone
    14:16进制转换10进制和字符串相乘 2020-09-22 18:37:17     notdone
    

    现在需要将第12行中的notdone修改为done,请问怎么办?

    sed实现将某行文字替换

    使用sed命令,将第12行的notdone替换为done。
    参考该文档的指令。https://www.cnblogs.com/YLuluuu/p/9258782.html
    直接在命令行终端为:

    sed -i '12 s/notdone/done/' todolist.txt
    

    i是表示就地修改文件。 12表示修改12行, 后面的指令是将notdone字符串替换为done字符串。
    这里有一个引号的问题. 报错sed: -e expression #1,
    最后这样解决——直接使用双引号,以及在原先的s/notdone/$2后加上/g.主要是加上了/g解决了问题。

    #!/bin/sh
    filename='todolist.txt'
    sed -i "$1 s/notdone/$2/g" $filename
    

    单引号就是所见即所得,双引号就是会输出所有的内容,如果里面有变量,会展现变量。
    参考该连接 https://blog.csdn.net/qq_25035099/article/details/79642261

    加入条件判断

    该脚本需要进一步完善,比如判断是否包含系统参数。

    shell中默认变量$#说明脚本参数的个数。
    shell的条件语句写法为:

    if[xxx];then
      xxxxx
    else
      xxxx
    fi
    

    shell中的循环语句:

    while []
    do 
      xxxx
    done
    

    在使用条件语句的时候,发现总是报not found的错误。

    #!/bin/bash
    filename='todolist.txt'
    
    if [$#!=0]
    then
    sed -i "$1 s/notdone/$2/g " $filename
    fi
    echo sed -i "$1 s/notdone/$2/g" $filename
    

    报错为./donesth.sh: 4: ./donesth.sh: [1==0]: not found.

    查了以下,shell中用if报not found错误是较为典型的。

    网上有一种解决方法: 在写if条件的时候if空格[空格$#==0空格],也就是说if后,[]的两侧都得是空格,这样才能够正确识别。
    原因我猜测是shell是通过将每行的文本读取后按照空格分割的,如果是单独的if ,[``]这些,它就能够识别出是有独特意义的,否则只会被当作普通字符串的一部分。
    最后成功了

    #!/bin/bash
    filename='todolist.txt'
    
    if [ $# != 0 ] #这里要注意,所有运算符,包括!=也要隔开。
    then
    sed -i "$1 s/notdone/$2/g " $filename
    fi
    echo sed -i "$1 s/notdone/$2/g" $filename
    

    什么是dash

    此外,发现ubuntu执行脚本的软连接并不是指向sh或者bash
    ll /bin/sh
    得到

    lrwxrwxrwx 1 root root 4 Apr 16 23:52 /bin/sh -> dash*
    

    dash和bash一样,是linux的shell的一种。
    sh是最基础的,而bash十分强大,dash是debian系默认用的shell。dash比bash要小,可能会存在一些其他的兼容问题。
    尽量在脚本中使用bash.

    bash和dash的区别 https://blog.csdn.net/weixin_39212776/article/details/81079727

    其他的问题

    sed还有哪些参数?
    如果用python实现,该如何实现?
    https://www.cnblogs.com/lonecloud/p/9066199.html

  • 相关阅读:
    理解Java虚拟机——Java内存模型管理
    Java 使用fastjson 将 json字符串写到文件中去
    java 如何调用 linux or mac 命令行
    MacOS 编译 openjdk8 并导入 Clion 调试
    linux ls 命令超级详解
    小 Q 与树 (点分治)
    mysql 索引策略
    java中serialVersionUID作用
    通过源码分析Spring Security用户认证流程
    使用PowerMockRunner和Mockito编写单元测试用例详解
  • 原文地址:https://www.cnblogs.com/goto2091/p/13715100.html
Copyright © 2011-2022 走看看