加入收藏 | 设为首页 | 会员中心 | 我要投稿 江门站长网 (https://www.0750zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 安全 > 正文

LinuxShell编程实战技巧

发布时间:2021-03-14 14:11:18 所属栏目:安全 来源:网络整理
导读:副标题#e# 目前,越来越多的企业应用会部署在 Linux 系统上的,而 Linux Shell 脚本可以极大地帮助我们完成这些应用的运维任务。这使得 Linux Shell 开发技能成为开发人员的一项重要的、有竞争力的技能。本文就笔者的实际开发经验,以 Korn Shell 为例分享

  清单 5. 自动收集日志文件

#!/usr/bin/ksh

main(){
collectSyslog #收集系统日志文件
collectMiddlewareLog #收集中间件日志文件
collectAppLog #收集应用系统日志文件
tar -zcf logs.tgz syslog.zip mdwlog.zip applog.zip #将三中类型的日志打包,方便下载
}

  若脚本执行报如下错误:

  tar: applog.zip: Cannot stat: No such file or directory

  我们可以很快锁定 collectAppLog 这个函数。因为它负责输出 applog.zip 这个文件。而没有必要看代码中的其它部分。

  采用模块化的方式的另一个好处是代码调试的结果可以巩固下来。比如上面的例子中,如果你已经调试好了操作状态日志收集的函数。接下来调试其它函数的时候,这些被调试的代码尽管可能需要改动。但是这些改动影响到之前已经调试好的代码的可能并不大。相反,若是一个脚本中通篇都是语句,而不带函数,则改动其中一行代码,收集三种日志的功能可能都受影响。

  另外一个典型的场景是脚本编写过程中,我们可能会因为不太确定一些问题如何处理而写一些尝试性的代码。然后,通过反复的调试去确认正确的处理方式。而事实上这些尝试性的代码可能就是一条语句甚至一个命令。但不少人是在大段的代码中反复去调试这一小段代码。这将非常耗时间。尤其是调试过程中代码中的其它部分调试时出现错误时,作者还得先解决其它错误,否则可能会时我们真正要调试的代码无法被执行到。这种情形下,专门写一个测试性的小脚本。

  在该脚本中调试还我们不太确定该如何写的代码,如何将其”集成”到我们正在开发的脚本中。这样可以提高调试效率,避免消耗本不该消耗的时间。比方说,我们在编写过程中需要获取脚本本身所在进程的进程 ID。而此时我们又不太确定这个获取当前进程 id 的代码该怎么写。那么,我们可以新建一个测试性的脚本在其中尝试实现这个获取进程 ID 的功能。找到正确的方法后,将代码“移植”到我们真正要开发的脚本中。

 处理大段字符输出

  脚本开发中经常要处理的一个问题是输出提示信息。当然,对于简短的提示信息输出,使用 echo 命令就足够了。但是,对于大段的提示信息输出仍然使用 echo 命令处理则显得不够优雅。一种更适合的方法是使用 cat 命令结合输入重定向。下面通过一个具体例子来说明这点。

  假设下面的脚本会将某个程序安装到用户指定的目录下。若用户指定的目录不存在,则提示

  用户检查指定的目录是否正确,并重新执行脚本。

  清单 6. 使用 echo 命令输出大段字符

#!/usr/bin/ksh

path="$1"

if [ ! -d "$path" ]; then
        #这里还必需处理星号这个特殊字符的显示
echo '****************************************************' 
echo ERROR
echo "The destination directory not exists,make sure below directory you specified is correct:"
echo ${path}
echo "Then re-run this script."
echo '****************************************************'
fi

  这种方式的代码可读性不是很好,阅读者需要阅读多个 echo 命令然后再进行”综合”才能准确理解提示信息是什么。另外,一旦提示信息需要改动。这种改动可能因为改动其中一个 echo 命令时不小心多了一个双引号等特殊字符而引起语法错误,从而影响了整个脚本的执行。

  清单 7 的代码则展示了如何使用 cat 命令和输入重定向来更好地处理大段文本的输出。

  清单 7. 使用 cat 命令输出大段字符

#!/usr/bin/ksh

path="$1"
if [ ! -d "$path" ]; then
cat<<EOF
****************************************************
ERROR
The destination directory not exists,make sure below
directory you specified is correct:
${path}
Then re-run this script.
****************************************************
EOF
fi

  显然,这种处理方式的代码更加简洁,可读性更好。阅读者只需要看一条命令,就知道提示信息的具体内容。并且,若要修改提示语,我们可以放心地在两个文件终止符 EOF 之间的部分改。即便修改错了,也不会影响到代码中的其它部分。

 避免使用非必要的临时文件

  新手在编写 Shell 脚本时往往在不必要使用临时文件的情况下使用了临时文件。这不仅增加了而外的代码编写工作量(用于处理创建、读取、和删除临时文件等),而且可能使脚本运行速度变慢(文件 I/O 毕竟不是快的操作)。

  下面的例子中假设有个脚本的功能是往当前目录下所有的.txt 文件中添加如下一行文本:

  –End of file name–

  清单 8.和清单 9.中的代码分别显示了在不必要使用临时文件的情况下使用临时文件的代码和不需要使用临时文件的代码。

  清单 8. 在不必要使用临时文件的情况下使用临时文件

#!/usr/bin/ksh

ls -lt *.txt | awk '{print $NF}' > tmp #将命令输出重定向到临时文件 tmp

cat tmp

typeset fileName

typeset lastLine

while read fileName #逐行读取临时文件中的每一行

do

 lastLine=`tail -1 "$fileName"`

 if [ ! "$lastLine" == "--End of $fileName--" ]; then

   echo "--End of $fileName--" >> $fileName

 fi

done <tmp #从临时文件进行输入重定向

rm tmp #删除临时文件

  清单 9. 不使用临时文件

#!/usr/bin/ksh

typeset fileName

typeset lastLine

for fileName in $(ls -lt *.txt | awk '{print $NF}')

do

 lastLine=`tail -1 "$fileName"`

 if [ ! "$lastLine" == "--End of $fileName--" ]; then

   echo "--End of $fileName--" >> $fileName

 fi

done

 使用支持 FTP 功能的编辑器

(编辑:江门站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!