学习助手开发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

原文地址:https://www.cnblogs.com/goto2091/p/13715100.html