1、脚本的编写

  Shell脚本本身是一个文本文件,这里编写一个简单的程序,在屏幕上显示一行helloworld!

脚本内容如下:

#!/bin/bash

#显示“Hello world!"

echo "hello world!"

运行命令和结果如下:

2、Shell脚本的基本构成

  编写Shell程序首先要了解Shell脚本的基本构成。下面为一个复杂一些的脚本示例,用于显示当前日期时间、执行路径、用户账户及所在的目录位置。

#!/bin/bash
#这是一个测试脚本
echo -n "当前时间和日期"
date
echo -n "程序执行路径:" $PACH
echo "当前用户名: `whoami`"
echo -n "当前路径:"
pwd
#end

  运行结果

通常,在第一行以“#”开头指定Shell脚本的运行环境,即声明该脚本使用哪个Shell程序运行。Linux中通常的Shell脚本解释器有bash、sh、csh、ksh等,其中bash是Linux默认的Shell。

以#开头的行为注释行,Shell在执行时会忽略"#"之后的所有内容。

echo命令用来显示提示信息,参数-n表示在显示信息时不自动换行。不加该参数,默认会在命令最后自动加上一个换行符以实现自动换行。

whoami字符串的左右的反引号(`)用于命令替换,也就是将他所括起来字符串视为命令执行,并将其输出的字符串在原地展开。

3、包含外部脚本

  像其他语言一样,Shell也可以包含外部脚本,将外部脚本的内容合并到当前脚本。包含外部脚本文件的用法如下:

. 脚本文件名

或者

source 脚本文件名

这里将第二个脚本合并到第一个脚本中,即为

#!/bin/bash
#显示“Hello world!"
echo "hello world!"
. example1

运行结果如下

4、执行Shell脚本

  执行Shell脚本有三种方式:

(1)在命令行提示符下直接执行

  将Shell脚本的权限设置为可执行,然后在命令行提示符下直接执行它就如我们之前示例里的一样。

需要注意的是,直接百年祭生成的脚本文件是没有执行权限的,如果要将Shell脚本直接当作命令执行,需要使用chmod命令将其设置为具有权限执行。

chmod +x example

  这里值得注意的是,如果包含外部脚本,被包含的脚本并不需要有执行权限。另外在图形界面中也可使用文件管理器来设置权限,允许脚本作为程序执行文件。  

  如果想像命令行那样直接输入脚本文件名,还需要让脚本所在的目录被包含在环境变量PATH 所定义的命令搜索路径中,否则就要明确指定脚本文件的路径,执行命令echo $PATH可查询当前的搜索路径(通常为/bin、/sbin、/usr/bin、/usr/sbin)。如果放置Shell脚本文件的目录不在当前的搜索路径中,可以将这个目录追加到搜索路径中。

(2)在指定的Shell下执行脚本

  可以在指定的Shell下执行脚本,以脚本名作为参数。基本用法如下:

Shell 名称 脚步名

  这种运行方式是直接运行Shell解释器,其参数就是Shell脚本的文件名,如:

sh hello

运行结果为:

  从运行结果可以看出这种方式无法在脚本中调用外部脚本。

  不过显然这种方式运行的脚本不必在第一行指定Shell解释器,即使指定了,也会忽略。而且由于是通过解释器来执行的,就不需要脚本文件具备执行权限。

  这种方式还能在脚本名后面带有参数,从而将参数值传递给程序中的命令,使一个Shell脚本可以处理多种情况,就如同函数调用时可根据具体问题给定相应的实参。所以这种方法多用来进行脚本调试。

(3)将输入重定向到Shell脚本

  还可以将输入重定向到Shell脚本。让Shell从指定文件中读入命令行,并进行相应处理,其一般形式为:

bash < 脚本名

例如

  bash < example1表示Shell脚本从文件example1中读取命令,并执行他们。

5、Shell脚本的调试

  通过对Shell脚本的调试,可以查找和消除错误。在bash中,Shell脚本的调试主要是利用bash命令解释程序的选项来实现。其格式如下:

bash [选项] 脚本名

  其中,主要利用bash命令解释程序的-V或-x选项来跟踪程序的执行。例如:

  通常,-v选项允许用户查看Shell程序的读入和执行。如果在读入命令行时发生错误,则终止程序的执行。每个命令行被读入后,Shell按读入时的形式显示出该命令行,然后执行命令行。而-x选项也允许用户查看Shell程序的执行,但它是在命令行执行前完成所有的替换后,才显示出每一个被替换后的命令行,并且在行前加前缀符号“+”(变量赋值语句不加"+"符号),然后执行命令。

  两者的主要区别在于:使用-v选项,会打印出命令行的原始内容;使用-x选项,打印出经过替换后的命令行的内容。这两个选项也可以在Shell脚本内部用“set -选项”的形式引出,用"set +选项"禁止该选项起作用。如果只想对程序的某一部分进行调试,则可以将该部分用上面两个语句单独划出来。

编写Shell脚本的更多相关文章

  1. 编写shell脚本遇到的问题

    运行shell脚本提示“syntax error near unexpected token for((i=0;i<$length;i++))”: 原因是因为Linux下的换行符是 \n 而你在 ...

  2. 在windows下编写shell脚本

    注意两点: 1.第一行:#!/bin/bash 2.将文档格式转换为unix,因为在windows下编写shell脚本回车符是\n\r,而linux下的回车符是\n,所以在linux下运行脚本的时候, ...

  3. linux 的基本操作(编写shell 脚本)

    终于到shell 脚本这章了,在以前笔者卖了好多关子说shell脚本怎么怎么重要,确实shell脚本在linux系统管理员的运维工作中非常非常重要.下面笔者就带你正式进入shell脚本的世界吧. 到现 ...

  4. 编写Shell脚本的最佳实践

    编写Shell脚本的最佳实践 http://kb.cnblogs.com/page/574767/ 需要记住的 代码有注释 #!/bin/bash # Written by steven # Name ...

  5. python编写shell脚本详细讲解

    python编写shell脚本详细讲解 那,python可以做shell脚本吗? 首先介绍一个函数: os.system(command) 这个函数可以调用shell运行命令行command并且返回它 ...

  6. CentOS下编写shell脚本来监控MySQL主从复制的教程

    这篇文章主要介绍了在CentOS系统下编写shell脚本来监控主从复制的教程,文中举了两个发现故障后再次执行复制命令的例子,需要的朋友可以参考下 目的:定时监控MySQL主从数据库是否同步,如果不同步 ...

  7. [转帖]编写shell脚本所需的语法和示例

    编写shell脚本所需的语法和示例 https://blog.csdn.net/CSDN___LYY/article/details/100584638 在说什么是shell脚本之前,先说说什么是sh ...

  8. linux环境下编写shell脚本实现启动停止tomcat服务

    第一步:以管理员的身份进入控制台,在指定目录下新建一个shell脚本,我这里命名为tomcat.sh 第二步:编写shell脚本 #!/bin/bash tomcat_home=/usr/tomcat ...

  9. 编写shell脚本实现对虚拟机cpu、内存、磁盘监控机制

    一.安装Vmware,并通过镜像安装centos7. 二.安装xshell(可以不装,可以直接在虚拟机中直接进行以下步骤) 三.安装mail 一般Linux发送报警邮件通过本地邮箱或外部邮箱服务器,这 ...

  10. 编写shell脚本的规范

    目录 编写shell脚本的一些规范 解释器 添加脚本版本和注释功能 添加脚本调试 变量命名 全局变量和局部变量 命名规范 函数命名 脚本命名 函数 引用模块或文件 脚本日志 配置文件 其他 编写she ...

随机推荐

  1. java8 数据结构的改变(一)

    在JDK1.6,JDK1.7中,HashMap采用数组+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里.但是当数组中一个位置上的元素较多,即hash值相等的元素较多时,通过key ...

  2. nested exception is java.lang.NoClassDefFoundError: org/springframework/dao/support/PersistenceExceptionTranslator

    该问题是少了一个spring-tx-的jar包,把该包加入到buildpath中就行了. 参考链接:http://blog.csdn.net/Rongbo_J/article/details/4666 ...

  3. Python编程笔记(第三篇)【补充】三元运算、文件处理、检测文件编码、递归、斐波那契数列、名称空间、作用域、生成器

    一.三元运算 三元运算又称三目运算,是对简单的条件语句的简写,如: 简单条件处理: if 条件成立: val = 1 else: val = 2 改成三元运算 val = 1 if 条件成立 else ...

  4. Apache Prefork、Worker和Event三种MPM分析

    三种MPM介绍 Apache 2.X  支持插入式并行处理模块,称为多路处理模块(MPM).在编译apache时必须选择也只能选择一个MPM,对类UNIX系统,有几个不同的MPM可供选择,它们会影响到 ...

  5. 自学java坎坷之路——20155312张竞予

    20155312 2006-2007-2 <Java程序设计>第一周学习总结 教材学习内容总结 第一周并没有在课堂上对教材内容进行学习,学习内容概括如下 课程分数构成,其中包括课堂测验(每 ...

  6. tensorflow下识别手写数字基于MLP网络

    # coding: utf-8 # In[1]: import tensorflow as tf import tensorflow.examples.tutorials.mnist.input_da ...

  7. 2018.12.29 codeforces 940E. Cashback(线性dp)

    传送门 题意:给出一个nnn个数的序列,要求将序列分成若干段,对于一段长度为kkk的自动删去最小的⌊kc⌋\left \lfloor \frac{k}{c} \right \rfloor⌊ck​⌋个数 ...

  8. Java核心技术之基础知识

    一.类型转换 数值类型之间的转换 强制类型转换 a)       将一个数值强制转换成另一种类型时,如果超出目标类型的便是范围,结果就会截断成一个完全不同的值.(如:(byte)300的实际值为44) ...

  9. 假期训练六(poj-1753,递归+hdu-2844,多重背包)

    题目一:传送门 题意:有一个4*4的棋盘,每次翻转一个棋子和它的上下左右的四个棋子,判断翻转多少次之后可以变为纯色的棋盘. 思路:总共有C(0,16)+C(1,16)+C(2,16)+……+C(16, ...

  10. hdu-1394(线段树&逆序数的性质和求法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题目大意: 给出一个序列,一对逆序数就是满足i<j&&a[i]>a[ ...