linuxshell编程实验报告(编写一个简单的shell脚本)

admin 179 0

本篇文章给大家谈谈linuxshell编程实验报告,以及编写一个简单的shell脚本对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

一、Linux命令、编辑器与Shell编程的内容简介

1、为了真正掌握Linux必须全面理解shell和命令行。以前,读者必须购买两本书才能掌握这些知识:一本介绍Linux基本概念和技术的指南,再加一本参考手册。现在,著名Linux专家Mark Sobell通过《Linux命令、编辑器与shell编程》一本书,不仅全面深入地介绍了系统管理员、开发人员和高级用户最需要的工具,而且涵盖了日常工作中最常用的参考资源。

2、《Linux命令、编辑器与shell编程》完全适用于所有发布版,可以把它用于任意Linux系统,包括现在和将来发布的Linux系统。《Linux命令、编辑器与shell编程》还全面介绍了Mac OS X命令行。包括其他Linux/UNIX图书忽略的仅用于OS X的工具和实用程序。

3、《Linux命令、编辑器与Shell编程》结构清晰.包含数百个优秀的实际范例,从最基础的知识开始,介绍了Linux中最有用的知识,包捶文体系统、shell、编辑器、实用程序、编程工具、正则表达式等。还添加了Perl的入门介绍,Perl是Linux管理员自动完成复杂、耗时的任务最重要的编程工具。

4、《Linux命令、编辑器与shell编程》是目前所能找到的最实用、最全面的Linux指南和参考手册,也是唯一涵盖以下全部内容的书籍

5、·更好、更实用的范例,涵盖了用户实际中需要执行的任务

6、·深入浅出地介绍了Linux和OSX的每个知识点

7、·适用于每个系统管理员的Pe门完整入门指南

8、·深入剖析如何使用bash和tcsh进行基本和高级的Linux shell编程

9、·从aspell到xargs的100个核心实用程序的全面阐述,包括从ditto到SetFile的Mac OS X专用实用程序

10、·新增了如何使用rsync自动完成远程备份的内容

11、·数十个系统安全提示:包括使用ssh和scp实现安全通信的详细步骤

12、·定制shell和从命令行交互使用shell的提示和技巧

13、·使用vim和emacs进行高效编辑的完全指南

14、·全面的命令参考部分——现在包含修订过和扩展过的索引,以便读者快速查找需要的信息

15、·使用apt-get和yum自动更新系统的指令

16、·数十个练习有助于读者提升实践能力和自信心

17、·还包括BitTorrent、gawk、Sed、find、sort、bzip2和正则表达式等内容

二、Linux Shell 脚本编程最佳实践

与其它的编码规范一样,这里所讨论的不仅仅是编码格式美不美观的问题,同时也讨论一些约定及编码标准。这份文档主要侧重于我们所普遍遵循的规则,对于那些不是明确强制要求的,我们尽量避免提供意见。

编码规范对于程序员而言尤为重要,有以下几个原因:

本文档中的准则致力于最大限度达到以下原则:

尽管本文档涵盖了许多基础知识,但应注意的是,没有编码规范可以为我们回答所有问题,开发人员始终需要再编写完代码后,对上述原则做出正确的判断。

注:未明确指明的则默认为必须(Mandatory)

仅建议Shell用作相对简单的实用工具或者包装脚本。因此单个shell脚本内容不宜太过复杂。

在选择何时使用shell脚本时时应遵循以下原则:

可执行文件不建议有扩展名,库文件必须使用.sh作为扩展名,且应是不可执行的。

执行一个程序时,无需知道其编写语言,且shell脚本并不要求具有扩展名,所以更倾向可执行文件没有扩展名。

而库文件知道其编写语言十分重要,使用.sh作为特定语言后缀的扩展名,可以和其他语言编写的库文件加以区分。

文件名要求全部小写,可以包含下划线 _或连字符-,建议可执行文件使用连字符,库文件使用下划线。

源文件编码格式为UTF-8。避免不同操作系统对文件换行处理的方式不同,一律使用 LF。

每行最多不超过120个字符。每行代码最大长度限制的根本原因是过长的行会导致阅读障碍,使得缩进失效。

如出现长度必须超过120个字符的字符串,应尽量使用here document或者嵌入的换行符等合适的方法使其变短。

除了在行结束使用换行符,空格是源文件中唯一允许出现的空白字符。

对从来没有用到的或者被注释的方法、变量等要坚决从代码中清理出去,避免过多垃圾造成干扰。

Bash是唯一被允许使用的可执行脚本shell。

可执行文件必须以#!/bin/bash开始。请使用 set来设置shell的选项,使得用 bash echo"Process$: Done making$$$."

#示例7:命令参数及路径不需要引号 grep-li Hugo/dev/"$1"

#示例8:常规变量用双引号,ccs可能为空的特殊情况可不用引号 git send-email--to"${reviewers}"${ccs:+"--cc""${ccs}"}

#示例9:正则用单引号,$1可能为空的特殊情况可不用引号 grep-cP'([Ss]pecial||?characters*)${1:+"$1"}

#示例10:位置参数传递推荐带引号的"$@",所有参数作为单字符串传递用带引号的"$*"# content of t.sh func_t{ echo num:$# echo args: 1:$1 2:$2 3:$3}

func_t"$@" func_t"$*"#当执行./t.sh a b c时输出如下: num: 3 args: 1:a 2:b 3:c num: 1 args: 1:a b c 2: 3:

因反引号如果要嵌套则要求用反斜杠转义内部的反引号。而$(command)形式的嵌套无需转义,且可读性更高。

使用 [[... ]],而不是 [, test,和/usr/bin/[。

因为在 [[和 ]]之间不会出现路径扩展或单词切分,所以使用 [[... ]]能够减少犯错。且 [[... ]]支持正则表达式匹配,而 [... ]不支持。参考以下示例:

尽可能使用变量引用,而非字符串过滤。

Bash可以很好的处理空字符串测试,请使用空/非空字符串测试方法,而不是过滤字符,让代码具有更高的可读性。正例:

当进行文件名的通配符扩展时,请指定明确的路径。

当目录中有特殊文件名如以-开头的文件时,使用带路径的扩展通配符./*比不带路径的*要安全很多。

Eval在用于分配变量时会修改输入内容,但设置变量的同时并不能检查这些变量是什么。反例:

请使用进程替换或者for循环,而不是通过管道连接while循环。

这是因为在管道之后的while循环中,命令是在一个子shell中运行的,因此对变量的修改是不能传递给父shell的。

这种管道连接while循环中的隐式子shell使得bug定位非常困难。反例:

如果你确定输入中不包含空格或者其他特殊符号(通常不是来自用户输入),则可以用for循环代替。例如:

使用进程替换可实现重定向输出,但是请将命令放入显式子 shell,而非 while循环创建的隐式子 shell。例如:

总是检查返回值,且提供有用的返回值。

对于非管道命令,使用$?或直接通过 if语句来检查以保持其简洁。

当内建命令可以完成相同的任务时,在shell内建命令和调用外部命令之间,应尽量选择内建命令。

因内建命令相比外部命令而言会产生更少的依赖,且多数情况调用内建命令比调用外部命令可以获得更好的性能(通常外部命令会产生额外的进程开销)。

加载外部库文件不建议用使用.,建议使用source,已提升可阅读性。正例:

除非必要情况,尽量使用单个命令及其参数组合来完成一项任务,而非多个命令加上管道的不必要组合。常见的不建议的用法例如:cat和grep连用过滤字符串; cat和wc连用统计行数; grep和wc连用统计行数等。

除特殊情况外,几乎所有函数都不应该使用exit直接退出脚本,而应该使用return进行返回,以便后续逻辑中可以对错误进行处理。正例:

推荐以下工具帮助我们进行代码的规范:

原文链接:http://itxx00.github.io/blog/2020/01/03/shell-standards/

获取更多的面试题、脚本等运维资料点击:运维知识社区获取

ansible---一键搭建redis5.0.5集群

三、学生信的那些事儿之七 - Linux基础之Shell脚本编程

1、沿着前面的轨迹,接下来是Linux中shell脚本的学习。这对于生信工程师后续处理大量(海量更合适些)数据是非常非常重要的,但是同样的,作为一个有点古板的人,对于"脚本"是什么意思我都死磕了好久。主要觉得有些抽象,尤其是跟生信的同事讨论项目分析部分的问题时,他们经常会说道这个词,在他们意识里这是个不言自明的术语,殊不知对外行人而言(比如我),那简直就是无情的"知识的诅咒"。经常是我假装听懂了,然后继续讨论下面的问题,形成一个模糊的印象。

2、百度上的解释是:脚本(Script)是一种批处理文件的延伸,是一种纯文本保存的程序,一般来说的计算机脚本程序是确定的一系列控制计算机进行运算操作动作的组合,在其中可以实现一定的逻辑分支等。不知道你能不能看懂,反正我开始的时候真是一知半解。

3、鸟哥私房菜的解释是:shell script是利用 shell的功能所写的一个"程序",这个程序是使用纯文本文件,将一些shell的语法与命令(含外部命令)写在里面,搭配正则表达式、管道命令与数据流重定向等功能,以达到我们所想要的处理的目的。不明觉厉,好像更看不懂了···

4、 Jude的简单粗暴大白话解释是:脚本就是Linux中很多命令按照一定规则的组合,以实现某个特定的功能。Linux中有很多简单的命令,往往只是进行了简单的对话,比如 cd就是进入到某个目录,简单直接。但是如果我想进入某个目录A,然后在目录A中创建目录B,再在目录B中创建文本C呢?当然可以一步一步操作,如果想要一步到位呢,那就可以用脚本,把三个命令写在一起,一起执行。好像有点啰嗦···

5、或者从英语的角度去理解,脚本的对应英文是Script,而这个单词的中文释义中还有剧本的意思。剧本就好理解了啊,剧本就是导演(生信工程师)基于某个主旨(要实现的目标)按照一定的手法(规则)所写的一个故事。不管是哪个演员,都得按照剧本演。所以,学好英语对于生信也是有帮助的~

6、这个无需多说,其实就是若干个简单命令的顺序排列,执行脚本后会按照命令的前后关系从前往后一一执行。

7、相对于简单的基本脚本,结构化的命令脚本可以施加逻辑流程控制,从而改变程序(命令)执行的顺序。基本脚本中的命令就是从上往下执行,但是结构化的命令脚本可以根据逻辑判断重复或者跳过某些命令。

8、后面还有什么嵌套循环啊啥的,不过我觉得上面的7中命令学到家了,应该可以应付大部分在生信分析里面的应用了。

9、记得高中的时候,物理老师(也是班主任)在给我们讲解习题时有个有意思的套路:不管什么难题现在下面写个"答:",以示自己解决问题的决心,也是一种正向的心理暗示。脚本编写也是有套路的,不过总的来说还是比较简单。

10、对于简单的脚本(超级简单的那种),直接几个命令连在一起即可,中间用";"隔开。

11、对于更长更复杂的脚本,一般需要创建一个文本,并在里面编辑。这就涉及到了文本编辑器,比较常用和简单的一般有nano和vim,实在很简单,规则也容易理解,教程随手可得,不多说。

12、比如用vim创建了一个脚本之后,具体的语法(套路):

13、 ok,脚本写完了,怎么让脚本开始工作呢?这有涉及到之前讲过的环境变量和相对路径、绝对路径了。方法有三:

14、就这么多吧,应该有点感觉到了,剩下的就是狂练狂练了~

关于linuxshell编程实验报告到此分享完毕,希望能帮助到您。