翼度科技»论坛 云主机 LINUX 查看内容

shell脚本技巧—创建和清空文件

11

主题

11

帖子

33

积分

新手上路

Rank: 1

积分
33
写这篇文章的起因是因为在分析一个脚本时,看到这么一句脚本,如下所示
  1. ................................
  2. >$RMAN_BACKUP/script/rman_backup.sql
  3. ................................
复制代码
最开始我以为它就是将文件rman_backup.sql清空,这个类似于 cat /dev/null > $RMAN_BACKUP/script/rman_backup.sql命令。但是实际调试过程发现它的功能不局限于此。其实它的功能为:如果文件不存在时创建这么一个空文件,如果文件存在时清空该文件。猜测编写者就是想通过这么一句简单代码去实现这样的两个功能,他都懒得去写一段逻辑判断:"如果文件不存在就创建空的文件,如果文件存在就清空文件"。说这个脚本精妙吧,倒也谈不上。但是也确实够精简,代价就是阅读起来晦涩难懂。尤其对shell脚本不精通的人。只是shell编程中确实有一些奇淫技巧.这里不谈其优点与缺点,存在既是合理。
那么在shell中,有哪些创建文件的技巧呢?下面简单总结一下,方便以后编写shell脚本时使用,也方便你阅读shell代码。
方法1

touch命令可以用来创建一个空文件,如果文件已经存在,则会更新其时间戳。
案例
  1. if [ ${MYSQL_SERVICE_EXISTS} -eq 1 ] && [ -f "$MYSQL_SERVICE_FILE" ]; then
  2.     touch /usr/lib/systemd/system/mysqld.service
  3.     chmod 644 /usr/lib/systemd/system/mysqld.service
  4.     cat >/usr/lib/systemd/system/mysqld.service <<EOF
  5.     ..................................
  6.     ..................................
  7. fi
复制代码
一般会用上面这种写法居多,使用最上面那种写法倒是比较少见。还有一些结合重定向符与其它命令实现的,如下所示
  1. ................................
  2. echo  "[error]:`date '+%Y%m%d %H:%M:%S'`> $log_msg" > $LOG_FILE
  3. ................................
复制代码
方法3:

使用tee命令可以用来读取标准输入并将其写入到文件和标准输出。如果文件不存在,tee命令会创建它
案例
  1. printf "it is test!\n" > filename.txt
复制代码
方法4:

使用cat命令创建一个文件,如下所示,这里使用Here Document( filename
案例
  1. >$RMAN_BACKUP/script/rman_backup.sql
  2. rman_backup |tee -a $RMAN_BACKUP/rman_backup.sql
复制代码
方法4

truncate命令可以用来减少文件的大小,将其设置为0字节,从而清空文件。
  1. cat >/usr/lib/systemd/system/mysqld.service <<EOF
  2. [Unit]
  3. Description=MySQL Server
  4. Documentation=man:mysqld(8)
  5. Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
  6. After=network.target
  7. After=syslog.target
  8.  
  9. [Install]
  10. WantedBy=multi-user.target
  11.  
  12. [Service]
  13. User=mysql
  14. Group=mysql
  15.  
  16. # Have mysqld write its state to the systemd notify socket
  17. Type=notify
  18.  
  19. # Disable service start and stop timeout logic of systemd for mysqld service.
  20. TimeoutSec=0
  21.  
  22. # Start main service
  23. ExecStart=/opt/mysql/mysql8.0/bin/mysqld --defaults-file=/data/mysql/conf/my.cnf $MYSQLD_OPTS
  24.  
  25. # Use this to switch malloc implementation
  26. EnvironmentFile=-/etc/sysconfig/mysql
  27.  
  28. # Sets open_files_limit
  29. LimitNOFILE = 100000
  30.  
  31. Restart=on-failure
  32.  
  33. RestartPreventExitStatus=1
  34.  
  35. # Set environment variable MYSQLD_PARENT_PID. This is required for restart.
  36. Environment=MYSQLD_PARENT_PID=1
  37.  
  38. PrivateTmp=false
  39. EOF
复制代码
方法5

: > filename.txt 这种方式来清空文件.
  1. > mysql_error.log
复制代码
其中:表示什么也不做。前面命令中它会清空文件内容(截断文件);与rm不同,因为rm实际上会完全删除文件。此外,如果文件不存在,则 :>filename.txt 实际上会创建该文件。更多关于这个命令的介绍如下所示,参考What is :>filename.txt Doing?[1]文中内容。
  1. echo ''  > mysql_error.log
复制代码
参考资料[1] 1: https://unix.stackexchange.com/questions/552436/what-is-filename-txt-doing
扫描上面二维码关注我如果你真心觉得文章写得不错,而且对你有所帮助,那就不妨帮忙“推荐"一下,您的“推荐”和”打赏“将是我最大的写作动力!本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.
来源:https://www.cnblogs.com/kerrycode/p/18493261
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具