什么是Shell脚本

shell script 是利用 shell 的功能所写的一个『程序 (program)』,这个程序是使用纯文本文件,将一些 shell 的语法与指令(含外部指令)写在里面, 搭配正则表达式、管线命令与数据流重导向等功能,以达到我们所想要的处理目的

shell script 可以简单的被看成是批处理文件, 也可以被说成是一个程序语言,且这个程序语言由于都是利用 shell 与相关工具指令, 所以不需要编译即可执行

我为什么要学Shell脚本

自动化

当然Shell脚本的功能有很多,目前对我而言就是为了减少手动操作的的次数

编写Shell脚本注意事项

  1. 指令的执行时从上到下、从左到右的分析与执行
  2. 指令、选项与参数间的多个空白都会被忽略掉
  3. 空白行也将被忽略掉,并且 [tab] 按键所推开的空白同样视为空格键
  4. 如果读取到一个 Enter 符号 (CR) ,就尝试开始执行该行 (或该串) 命令
  5. 至于如果一行的内容太多,则可以使用『 [Enter] 』来延伸至下一行
  6. 『 # 』可做为批注!任何加在 # 后面的资料将全部被视为批注文字而被忽略

如何执行一个脚本文件

比如在/home/rivers/目录下有一个shell.sh脚本文件

  • 直接下达命令

(1)绝对路径
使用 /home/rivers/shell.sh 来下达指令
(2)相对路径
假设工作目录在 /home/rivers/ ,则使用 ./shell.sh 来执行
(3)变量『PATH』功能
把shell.sh放在 PATH 指定的目录内,例如: ~/bin/

  • 以 bash 程序来执行

通过 bash shell.sh或sh shell.sh来执行

Shell脚本的Hello World

#!/bin/bash
# Program:
# This program shows "Hello World!" in your screen.
# History:
# 2018/12/22 Rivers First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo -e "Hello World! \a \n"
exit 0

上面代码格式是《鸟哥Linux私房菜》建议的一种写Shell脚本的格式

代码格式解释

  • 第一行 #!/bin/bash 在宣告这个 script 使用的 shell 名称

因为我们使用的是 bash ,所以,必须要以『 #!/bin/bash 』来宣告这个文件内的语法使用bash 的语法
那么当这个程序被执行时,他就能够加载 bash 的相关环境配置文件 (一般来说就是 non-login shell 的~/.bashrc), 并且执行 bash 来使我们底下的指令能够执行!这很重要的!(在很多状况中,如果没有设定好这一行, 那么该程序很可能会无法执行,因为系统可能无法判断该程序需要使用什么 shell 来执行啊!)

  • 程序内容的说明

整个 script 当中,除了第一行的『 #! 』是用来宣告 shell 的之外,其他的 # 都是『批注』用途! 所以上面的程序当中,第二行以下就是用来说明整个程序的基本数据。一般来说, 建议你一定要养成说明该script 的:1. 内容与功能; 2. 版本信息; 3. 作者与联络方式; 4. 创建日期;5. 历史纪录 等等。这将有助于未来程序的改写与 debug 呢!

  • 主要环境变量的宣告

建议务必要将一些重要的环境变量设定好,鸟哥个人认为, PATH 与 LANG (如果有使用到输出相关的信息时) 是当中最重要的! 如此一来,则可让我们这支程序在进行时,可以直接下达一些外部指令,而不必
写绝对路径呢!比较方便啦!

  • 主要程序部分

就将主要的程序写好即可!在这个例子当中,就是 echo 那一行啦!

  • 执行成果告知 (定义回传值)

利用 exit 这个指令来让程序中断,并且回传一个数值给系统。 在我们这个例子当中,使用 exit 0 ,这代表离开 script 并且回传一个 0 给系统, 所以执行完这个 script 后,若接着下达 echo $? 则可得到0 的值喔! 利用这个 exit n (n 是数字) 的功能,我们还可以自定义错误讯息, 让这支程序变得更加的 smart 呢!

执行结果

[root@node01 bin]# sh hello.sh
Hello World!

可以看到我们使用的是第二种bash的方式执行的脚本,也可以使用直接命令的方式:

[root@node01 bin]# ./hello.sh
-bash: ./hello.sh: Permission denied

纳尼?无法执行的原因写的很明显,没有权限,而我们在上面总结的时候特意强调,使用直接下达命令执行脚本,必须得给这个脚本增加可执行权限

[root@node01 bin]# chmod a+x hello.sh ; ./hello.sh
Hello World!

建议

  • 撰写 script 的工具最好使用 vim 而不是 vi ,因为 vim 会有额外的语法检验机制,能够
    在第一阶段撰写时就发现语法方面的问题
  • 按照上面的格式,养成一个良好的编写脚本格式的习惯

Shell脚本编程之(一)Shell脚本简介相关推荐

  1. (shell脚本编程)linux如何利用脚本执行多条命令以及linux如何执行定时任务

    文章目录 shell脚本编程 条件语句 脚本执行多条命令 执行定时任务 本文着重于提高我们的生产力,所以将这几个作为了一个专题. shell脚本编程 脚本中不同语句用分号隔开,和c语言一样. for, ...

  2. linux系统shell脚本编程,Linux系统shell脚本编程(一)

    哈喽,大家好,我是Adam.前面我发了不少关于linux 的文章,今天也是一样,将分几篇文章系统化的讲讲shell脚本编程.废话不多说,走起走起!        首先说一下shell脚本是什么.简单来 ...

  3. linux脚本编程延时函数,shell脚本编程之函数

    技术交流QQ群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 1.基本的脚本函数 脚本函数出现的目的:为了解决大型处理过程中,需要将相同的重复代码封装起 ...

  4. Linux命令行与shell脚本编程大全(shell脚本编程基础部分)

    第十一章 构建基本脚本 #为注释,但#!在第一行中后可以接shell的种类:如#!/bin/bash 会告诉shell用哪个shell来运行脚本 echo -n(显示在同一行中) 环境变量:set 用 ...

  5. Shell脚本编程:使用shell打印九九乘法表

    前言 学了东西就得用起来,学习任何东西都一样,学以致用嘛.下面是用shell脚本编写九九乘法. 用到了shell函数.while循环.if条件控制 等shell基本语法. 脚本代码 #!/bin/ba ...

  6. linux多进程spawn,【Linux Shell脚本编程】expect解决脚本交互 + Shell的多进程处理

    如果在没有使用密钥认证的情况下,想通过SSH来传输文件给多个主机会面临交互的问题,这在脚本中是非常不友好的.要解决这个问题的话可以使用expect这个工具,它的功能就是提前把交互中需要的内容先写好,然 ...

  7. java dtu 采集程序_DTU脚本编程_本地采集脚本指令详解

    前言: 通过配置DTU的脚本指令实现DTU定时自动采集,用户只需知道外接仪表.无需再单独增加控制器传感器的采集流程,然后通过编写脚本指令即可让DTU按照用户的流程自动采集.上传数据.脚本实现了基本的开 ...

  8. shell脚本编程for循环求阶乘_shell脚本编程(完结版).pdf

    shell脚本编程(完结版) Shell 脚本编程学习笔记 2013 年 5 月 2 日 追风~忆梦 如有任何疑问,请联系作者,作者 QQ:1028150787,或者到韦东山群共同讨论 1 Shell ...

  9. 【Linux命令行与Shell脚本编程】第五章 理解 Shell 父子关系 后台进程 协程

    Linux命令行与Shell脚本编程 第五章 理解 Shell 文章目录 Linux命令行与Shell脚本编程 五,理解 Shell 5.1,shell的类型 5.2,shell的父子关系 5.2.1 ...

  10. 《Linux命令行与shell脚本编程大全》(第三版)读书笔记

    第一部分 Linux命令行 第三章.基本的bash shell命令 bash手册 man 命令 例子: man cat 空格翻页.回车下一行.左右键看右侧(左侧)内容.q退出 info info in ...

最新文章

  1. 测试工程师的好日子来啦?Testin发布AI测试产品,提升易用性和自动化效率
  2. Android中使用running services查看service进程内存
  3. 聊聊flink的logback配置
  4. CentOS 下 yum(基于rpm的包管理工具) 命令详解
  5. 导入第三方库报 unknown type name 'NSString' 错误
  6. spark 中的RDD编程:基于Java api
  7. 类型转换和操作符重载 (c#)
  8. nginx mozilla_如何开始为Mozilla贡献力量
  9. 同一个SQL语句,为啥性能差异咋就这么大呢?
  10. 电脑重启后不必输入用户名密码,直接自己登入的方法
  11. 评价类问题中的模糊综合评价法
  12. Warshall 算法
  13. iOS AVCapture前置摄像头不显示镜像翻转
  14. 一文看懂抢注域名的相关问题解答
  15. CPU-Z V1.99 x64 得分
  16. 百鸡问题用计算机思维,大力出奇迹:当古代数学难题遇到计算机
  17. 户口本识别/户口本OCR识别
  18. 1.4、云计算HCIA虚拟化存储基础知识
  19. vlog常用参数解析
  20. JavaScript typeof, null, 和 undefined

热门文章

  1. Java基础__Integer类型中的自动装箱
  2. 【转】cs231n学习笔记-CNN-目标检测、定位、分割
  3. JSON C# Class Generator ---由json字符串生成C#实体类的工具(转)
  4. struts2 struts.xml 配置(转载)
  5. office2003 office2007同时安装 配置问题的解决
  6. 腾讯“云+未来”峰会亮相山城,助力重庆成为数字中国新标杆
  7. SNMP协议交互学习-获取udp的udpindatagrams
  8. 企业引进HRM系统需要规避的五大误区
  9. 贪心 FZU 2013 A short problem
  10. Objective-C中的UIScrollView