老陌的第一个脚本
Tofloor
poster avatar
老陌
deepin
2018-07-20 06:07
Author

刚才学习了脚本,由于才学脚本第一课,学习了设定解释器,返回值,还有用 && 和 || 对命令进行连接这四个知识点。
虽然只学习了四个知识点,不过老陌已经按耐不住了,激动之余写了一个小脚本,自娱自乐。

一、功能需求:

当用户第一次登录时显示:

********************************
今天是:2018-07-19


伟大的老陌上线了
欢迎老陌莅临指导!!! 掌声!!!!


********************************

当用户再次登录,不显示了。 当第二天的第一次登录又显示了,以此类推。


二、设计思路

设定两个文件 timea, timeb,这里存放年月日,每次运行时更新这两个文件。 当这两个文件不一样时,通过返回值判断是否显示欢迎信息。

  • 第一次运行脚本,没有这两个文件,diff命令失败,显示上面的欢迎信息
  • 第二次运行脚本,由于已经有了这两个文件,而且时间相同,diff命令成功,不显示欢迎信息
  • 第二天的第一次运行脚本,由于两个文件的时间不同步,diff命令比较失败,显示上面的欢迎信息,之后同步时间。
  • 以此类推……



三、实现

我把这些脚本放到~/.welcome目录中

  1. mkdir ~/.welcome
Copy the Code


编写脚本:~/.welcome/welcom 显示欢迎信息

  1. echo ""
  2. echo "********************************"
  3. echo "今天是:`date +%Y-%m-%d`"
  4. echo ""
  5. echo "伟大的老陌上线了"
  6. echo "欢迎老陌莅临指导!!! 掌声!!!!"
  7. echo ""
  8. echo "********************************"
Copy the Code


编写脚本: ~/.welcome/start

  1. #!/bin/bash

  2. echo `date +%Y%m%d` > ~/.welcome/timea
  3. diff ~/.welcome/timea ~/.welcome/timeb 1>/dev/null 2>&1 || ~/.welcome/welcome
  4. echo `date +%Y%m%d`> ~/.welcome/timeb
Copy the Code


添加执行权限
  1. chmod u+x ~/welcome/*
Copy the Code


把start写到~/.bashrc中

  1. echo "~/.welcome/start" >> ~/.bashrc
Copy the Code

四、测试

第一次运行:


第二次运行:



Reply Favorite View the author
All Replies
avatar
zwq133
deepin
2018-07-20 06:31
#1
这学习能力。。。。。。我还能说啥。。。。。。逃~~
Reply View the author
avatar
jianguo922
deepin
2018-07-20 07:15
#2
赞一个        
Reply View the author
avatar
kingskill
deepin
2018-07-20 07:33
#3
看得眼热~~~
Reply View the author
avatar
s***1@gmail.com
deepin
2018-07-20 07:49
#4
顶你      
Reply View the author
avatar
ritter
deepin
2018-07-20 07:56
#5
6666666666666
Reply View the author
avatar
whoam1
deepin
2018-07-20 08:23
#6
厉害
Reply View the author
avatar
rekols
deepin
2018-07-20 08:59
#7
给老陌一个赞!
Reply View the author
avatar
Ligocut光剪视频剪辑软件
deepin
Backbone of ecological co-construction group
2018-07-20 09:59
#8
学习能力貌似是指数型的。。。。
Reply View the author
avatar
gaoshou
deepin
2018-07-20 17:16
#9
老莫的进步真可谓一日千里
Reply View the author
avatar
central_1
deepin
2018-07-20 17:48
#10
咱俩基本同一个时间段开始使用的deepin,结果,我这啥都还不会呢,你这已经自己写脚本了,捂脸
Reply View the author
avatar
老陌
deepin
2018-07-20 18:12
#11
https://bbs.deepin.org/post/166377
咱俩基本同一个时间段开始使用的deepin,结果,我这啥都还不会呢,你这已经自己写脚本了,捂脸 ...

你都带上红领巾了,我还没有带上呢。
Reply View the author
Comments
hhlh2l
2018-07-22 22:55
红领巾好像是加入装机志愿者就有~~
和是不是小朋友没有关系~~
avatar
y***z@tom.com
deepin
2018-07-20 18:20
#12
diff ~/.welcome/timea ~/.welcome/timeb 1>/dev/null 2>&1 || ~/.welcome/welcome
echo `date +%Y%m%d`> ~/.welcome/timeb
这两行次序是否颠倒了?
Reply View the author
avatar
老陌
deepin
2018-07-20 18:23
#13
https://bbs.deepin.org/post/166377
diff ~/.welcome/timea ~/.welcome/timeb 1>/dev/null 2>&1 || ~/.welcome/welcome
echo `date +%Y%m%d`> ~ ...

先比较,再更新,要不判断不了第二天的时间。
Reply View the author
avatar
central_1
deepin
2018-07-20 21:25
#14
https://bbs.deepin.org/post/166377
你都带上红领巾了,我还没有带上呢。

红领巾是啥意思,一直都没弄明白。。。。。。
Reply View the author
avatar
kingskill
deepin
2018-07-20 22:09
#15
老陌可以把diff那串关键的命令详细解释一下,方便小白。比如俺。。。啊哈哈哈。。。
Reply View the author
avatar
老陌
deepin
2018-07-20 23:08
#16
本帖最后由 myccloves 于 2018-7-22 13:07 编辑
https://bbs.deepin.org/post/166377
老陌可以把diff那串关键的命令详细解释一下,方便小白。比如俺。。。啊哈哈哈。。。 ...

好的。
首先我们要了解diff命令的作用:是比较两个文件内容是不是一样
  1. linux@myccloves:~$ touch a b
  2. linux@myccloves:~$ diff a b
Copy the Code
我们先创建a,b两个文件,因为文件的内容都是空的,所以diff a b 时,由于内容一样,所以显示任何输出,表示成功。

  1. linux@myccloves:~$ diff a c
  2. diff: c: No such file or directory
Copy the Code
这次我们比较a和c,我们知道 c这个文件不存在,所以报错。 但报错了会输出错误信息,我们需要隐藏这些出错信息,要不在欢迎里面显示错误信息算怎么回事。

  1. linux@myccloves:~$ diff a c 2>/dev/null
  2. linux@myccloves:~$ echo $?
  3. 2
Copy the Code
我们加上2>/dev/null,这句就是把错误信息重定向到/dev/null这个文件中,这个文件是个无底洞,随意放东西。 但这样没有提示信息,用户并不知道diff报错没有, 可以用变量$?测试出来。每条命令运行成功后返回一个数值,如果是0表示命令运行成功,返回的值放到 $?这里面。 根据上面的显示是2,所以diff运行失败。

现在已经有两种情况:
  • a,b存在,并且相同,diff比较成功,返回0
  • a,c有一个文件或两个文件都不存在,报错, 返回非0

还有一种情况就是:

a,b都存在,但里面的内容不存在

  1. linux@myccloves:~$ cat /etc/os-release  > a
  2. linux@myccloves:~$ diff a b
  3. 1,7d0
  4. < PRETTY_NAME="Deepin 15"
  5. < NAME="Deepin"
  6. < VERSION_ID="15.6"
  7. < VERSION="15.6"
  8. < ID=deepin
  9. < HOME_URL="https://www.deepin.org/"
  10. < BUG_REPORT_URL="http://feedback.deepin.org/feedback/"
  11. linux@myccloves:~$ echo $?
  12. 1
Copy the Code


这次我们把/etc/os-release中的内容,重定向到a中,这说明a,b的内容不同了。用diff查看,结果不一样,并且把不一样的结果打印出来。 最后用$?判断,返回的不是0,说明两个文件不相等。 我们需要把打印输出的内容隐藏

  1. linux@myccloves:~$ diff a b 2>/dev/null
  2. 1,7d0
  3. < PRETTY_NAME="Deepin 15"
  4. < NAME="Deepin"
  5. < VERSION_ID="15.6"
  6. < VERSION="15.6"
  7. < ID=deepin
  8. < HOME_URL="https://www.deepin.org/"
  9. < BUG_REPORT_URL="http://feedback.deepin.org/feedback/"
Copy the Code
但我们发现,并没有被隐藏,因为这个输出不是命令错误,而是比较的结果,属于正常输出。那么我们需要用另一种重定向

  1. linux@myccloves:~$ diff a b >/dev/null
Copy the Code
这回行了,没有报错,但现在要求,即能处理命令出错时的信息,也能处理文件不同时正常输出的信息,让这些信息全部隐藏,可以参考我上面那样写,或简单写

  1. diff a b >& /dev/null
Copy the Code


好了,diff命令的比较与隐藏信息解释完了,后面的||命令,可以参考老陌的另一个帖子:

https://bbs.deepin.org/post/166393

这里面第三大点解释



Reply View the author
avatar
Feelup
deepin
2018-07-21 01:09
#17
https://bbs.deepin.org/post/166377
好的。
首先我们要了解diff命令的作用:是比较两个文件内容是不是一样
我们先创建a,b两个文件,因为文件 ...

你真厉害!很想了解一下你的职业呢!
Reply View the author
avatar
老陌
deepin
2018-07-22 21:07
#18
https://bbs.deepin.org/post/166377
你真厉害!很想了解一下你的职业呢!

文职。
Reply View the author
avatar
Feelup
deepin
2018-07-23 22:02
#19

你这不是更让人崇拜了!
Reply View the author