构建基本脚本(第十一章)

1.1 多命令;

shell脚本可以通过;将命令串起来一起运行,甚至可以将前一个命令执行的结果作为参数传给后一个命令执行。

[[email protected] ~]# date;who
Mon Jul 17 20:46:33 CST 2017
(unknown) :0           2017-07-14 11:10 (:0)
root     pts/0        2017-07-17 13:08 (192.168.186.1)
root     pts/1        2017-07-17 20:40 (192.168.186.1)

1.2 创建脚本文件

1.2.1 脚本文件必须以.sh后缀结尾

1.2.2 第一行必须指明shell,可以是bash,也可以是其他shell

#!/bin/bash

1.2.3 #后为注释内容,不会运行,可以在指定shell以后添加脚本注释,注明脚本用途

 #This script displays the date who‘s logged on

1.2.4 脚本必须给用户加上执行权限才可以运行;

1.2.5 脚本运行方式:

(1)可以将脚本路径导入到环境变量中;

(2)输入脚本的完整路径运行;

(3)在脚本路径下使用./shell.sh运行脚本

1.2.6 环境变量导入方法

(1)可以通过PATH=$PATH:脚本路径临时导入

(2)在/etc/profile.d/路径下创建一个.sh的文件,输入PATH=$PATH:脚本路径,每次开机时会自动读取新增的环境变量;

(3)有些发行版环境变量中有$HOME/bin,只要在家目录下创建bin目录,将shell脚本放入bin目录中

1.3 显示消息echo命令

echo命令可以将输入的内容打印到屏幕上,如果输入的内容中包含‘号,需要使用“”将输入内容引起来。-n选项可以忽略换行符。有些特殊符号需要使用/转义

1.4 使用变量

1.4.1 环境变量,可以直接在shell脚本中引用环境变量,例如如下脚本

[[email protected] ~]# vi test.sh
#!/bin/bash
#This script displays the environment variable
echo "This user UID is:$UID"
echo The homedir is:$HOME
~
~
"test.sh" [New] 4L, 114C written
[[email protected] ~]# chmod a+x test.sh 
[[email protected] ~]# ./test.sh 
This user UID is:0
The homedir is:/root

1.4.2 用户变量

用户变量赋值:var=变量值

在shell脚本中,变量复制以后仅在当前shell执行时生效,shell执行结束后,变量值失效

变量值还可以引用其他变量,例如:

[[email protected] ~]# vi test.sh
#!/bin/bash
var1=10
var2=$var1
echo “var2的值为$var1”
~
~
"test.sh" 4L, 61C written
[[email protected] ~]# ./test.sh 
“var2的值为10”

1.4.3 命令替换

命令替换的方式有如下两种:

var1=`date` :变量var1为date命令的执行结果

[[email protected] ~]# var1=`date`
[[email protected] ~]# echo $var1
Tue Jul 18 09:29:33 CST 2017

var2=$(date):同上

[[email protected] ~]# var2=$(date)
[[email protected] ~]# echo $var2
Tue Jul 18 09:31:04 CST 2017
[[email protected] ~]#

1.4.4 输入输出重定向

输出重定向:

>:输出覆盖重定向,会将内容覆盖重定向的内容或文件

>>:输出追加重定向,会将内容追加到重定向的内容后或文件中

参数:

set -C:禁止将内容覆盖已有的文件中

>|:强制覆盖

set +C:允许覆盖,一般默认为此项

2>:命令执行报错则会将错误信息重定向覆盖到指定文件中

2>>:命令执行报错则会将错误信息重定向追加到指定文件中

COMMAND >/PATH/FILENAME1 2>/PATH/FILENAME2 :将命令正确和错误的输出接口重定向覆盖至不同路径,使用2>、2>>追加同样适用

COMMAND &> /PATH/FILENAME 将正确和错误的信息都覆盖到同一个文件中,使用&>>可追加到同一个文件中。

COMMAND >/PATH/FILENAME &1 效果同上,使用追加同样适用。

输入重定向:<

COMMAND < input:可以将输入作为参数传递给COMMAND执行

[[email protected] ~]# wc <test1
 1  5 36

COMMAND << EOF:<<为内联输入重定向,可以将当前输入做出命令的参数,EOF为退出符,可自定义其他字符串作为退出符。

[[email protected] ~]# wc << EOF
> test1
> test2
> test3
> EOF
 3  3 18

1.5 管道命令|

COMMAND | COMMAND |COMMAND:管道命令可以将前一条命令执行的结果作为参数传给管道后一条命令执行。可以使用多个管道

[[email protected] ~]# ls |wc
     13      13     125

1.6 数学运算

1.6.1 expr命令:expr可以执行数学运算

示例:

[[email protected] ~]# expr 1 + 5
6

expr可识别的命令操作符如下:

ARG1 | ARG2 :或运算,如果ARG1不是null值也不是0值则返回ARG1,反之则返回ARG2

[[email protected] ~]# expr 1 \| 2
1
[[email protected] ~]# expr 0 \| 2 
2

ARG1 | ARG2:与预算,如果参数没有null值或0值则返回ARG1,否则返回0

ARG1 < ARG2 如果ARG1小于ARG2,返回1;否则返回0

ARG1 <= ARG2 如果ARG1小于或等于ARG2,返回1;否则返回0

ARG1 = ARG2 如果ARG1等于ARG2,返回1;否则返回0

ARG1 != ARG2 如果ARG1不等于ARG2,返回1;否则返回0

ARG1 >= ARG2 如果ARG1大于或等于ARG2,返回1;否则返回0

ARG1 > ARG2 如果ARG1大于ARG2,返回1;否则返回0

ARG1 + ARG2 返回ARG1和ARG2的算术运算和

ARG1 - ARG2 返回ARG1和ARG2的算术运算差

ARG1 * ARG2 返回ARG1和ARG2的算术乘积

ARG1 / ARG2 返回ARG1被ARG2除的算术商

ARG1 % ARG2 返回ARG1被ARG2除的算术余数

STRING : REGEXP 如果REGEXP匹配到了STRING中的某个模式,返回该模式匹配

match STRING REGEXP 如果REGEXP匹配到了STRING中的某个模式,返回该模式匹配

substr STRING POS LENGTH 返回起始位置为POS(从1开始计数)、长度为LENGTH个字符的子字符串

index STRING CHARS 返回在STRING中找到CHARS字符串的位置;否则,返回0

length STRING 返回字符串STRING的数值长度

+ TOKEN 将TOKEN解释成字符串,即使是个关键字

(EXPRESSION) 返回EXPRESSION的值

1.6.2 方括号运算$[]

示例:

[[email protected] ~]# var1=$[1+5]
[[email protected] ~]# echo $var1
6

1.6.3 let运算表达式

示例:

[[email protected] ~]# let var1=1+2
[[email protected] ~]# echo $var1
3

1.6.4 $(())运算表达式

示例:

[[email protected] ~]# var=$((2+2))
[[email protected] ~]# echo $var
4

1.6.5 增强型赋值符

+=    -=    *=    /=    %=

[[email protected] ~]# let count+=1
[[email protected] ~]# echo $count
1
[[email protected] ~]# let count+=1
[[email protected] ~]# echo $count 
2

1.6.7 自增自减

++:自增

--:自减

1.6.8 浮点运算

bc:浮点运算计算器,可以进行浮点运算,使用 quit命令退出

[[email protected] ~]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty‘. 
1.1+1.2
2.3
quit

bc -q:静默模式,可以省略提示信息

[[email protected] ~]# bc -q
5.5+6.342
11.842
quit

bc支持变量运算

[[email protected] ~]# bc -q
var=10.123
var1=342.32
var+var1
352.443
quit

bc设置小数点有效位数:scale

[[email protected] ~]# bc -q
5/3
1
scale=3
5/3
1.666
quit

在脚本中使用bc,通常使用命令替换的方式:

[[email protected] ~]# var=$(echo "scale=4;5 / 3" | bc)
[[email protected] ~]# echo $var
1.6666
[[email protected] ~]# vi test.sh 
#!/bin/bash
var1=10
var2=3
var=$(echo "scale=3;$var1/$var2"|bc)
echo "var is $var"
~                                                                                                      
~                                                                                                                                                                                                           
~                                                                                                      
"test.sh" 5L, 83C written
[[email protected] ~]# ./test.sh 
var is 3.333

在脚本中使用bc,还可以使用内联重定向的方式<<

[[email protected] ~]# vi test.sh 
#!/bin/bash
var1=10.11
var2=13.453
var3=100.3212
var4=3234
var5=$(bc<<EOF
scale=2
a1=($var1*$var2)
a2=($var3/$var4)
a1/a2
EOF
)
echo "var5 is $var5"
~                                                                                                      
~                                                                                                      
~                                                                                                                                                                                                           
~                                                                                                      
"test.sh" 13L, 149C written
[[email protected] ~]# ./test.sh 
var5 is 4533.63

1.7 退出脚本

$?:可以查看命令运行状态,0表示命令运行正常,其他数字则表示脚本运行错误。

[[email protected] ~]# echo $?
0
[[email protected] ~]# ssldkf
bash: ssldkf: command not found...
[[email protected] ~]# echo $?
127

常见的退出码含义:

0     命令成功结束

1     一般性未知错误

2     不适合的shell命令

126     命令不可执行

127     没找到命令

128     无效的退出参数

128+x     与Linux信号x相关的严重错误

130     通过Ctrl+C终止的命令

255     正常范围之外的退出状态码

exit命令:可以指定脚本结束时退出时的退出码

[[email protected] ~]# vi test.sh 
#!/bin/bash
var1=10.11
var2=13.453
var3=100.3212
var4=3234
var5=$(bc<<EOF
scale=2
a1=($var1*$var2)
a2=($var3/$var4)
a1/a2
EOF
)
echo "var5 is $var5"
exit 10
~                                                                                                      
~                                                                                                      
~                                                                                                      
~                                                                                                                                                                                                           
"test.sh" 14L, 157C written
[[email protected] ~]# ./test.sh 
var5 is 4533.63
[[email protected] ~]# echo $?
10

通过上述示例可看出,脚本退出码已被更改为10

退出码还可以使用变量表示,退出码的范围为0-255,退出码共计256位,如果指定的退出码大于255,则退出码会显示取模值。

[[email protected] ~]# vi test.sh 
#!/bin/bash
var1=10
var2=300
var3=$[ $var1 * $var2 ]
echo "var3 is $var3"
exit $var3
~                                                                                                      
~                                                                                                                                                                                                    
~                                                                                                      
~                                                                                                      
~                                                                                                      
"test.sh" 6L, 85C written
[[email protected] ~]# ./test.sh 
var3 is 3000
[[email protected] ~]# echo $?
184
时间: 2024-12-20 08:37:58

构建基本脚本(第十一章)的相关文章

构建之法第十一章读后感

本周进行了构建之法的第十一章软件设计与实现的学习: 第十一章主要讲了典型的开发流程,常见的分析和设计方法:ERD,DFD,UML,开发阶段的一些管理方法:每日构建,小强地狱,构建大师: 分析和设计方法包括以文字为主的文档,以图形为主构造的模型,用数学语言的描述,用类自然语言+代码构造的描述,原代码加注释也能描述: 图形模型和分析方法:1表达实体与实体之间的关系如思维导图,实体关系图,Use Case Diagram.2.表达数据的流动.3.表达控制流.4.统一的表达方式. 其他的设计方法包括形式

构建之法阅读笔记08-第十一章

阅读笔记 第十一章:软件设计与实现 在第十一章的软件设计与实现方面,介绍了一些关于典型的开发流程和开发阶段的一些管理方法. 在拿到设计文档之后,还需要做一些其他事情,比如估计任务所需要的时间,写一些原型代码,看看效果:做代码的自我复审,进行重构:写单元测试等等.最后还要把修改集集成到代码库中. 开发人员有一个标准的工作流程:进行功能需求分析,复审设计文档,详细设计,实现设计来编写代码,同伴复审,源代码的合并.构建等等,其中的每一步都有可能出现bug,要随时发现并且修改bug,最后是测试完成,发布

《构建之法》阅读笔记第十&amp;十一章

<构建之法>第十&十一章主要讲述了在软件设计前期的需求分析问题上的方法和实践经验,分为“典型用户和场景”以及“软件设计与实现”.其中第十章大部分内容和教授上课所讲的一样比如说,用户的分类(典型用户可以包括以下内容: 1. 名字(越自然越好) 2. 年龄(不同年龄和收入的用户有不同的需求) 3. 收入 4. 代表的用户在市场上的比例和重要性(比例大不等同于重要性高,如付费的用户比例较少,但是影响大,所以更重要 5. 使用这个软件的典型场景 6. 使用本软件/服务的环境(在办公室/家里/沙

阅读《构建之法》十一、十二、十三章

第十一章 问题:为了避免误解,我们是不是可以把我们理解的告诉用户,并且最好是图像的形势或是其他方式展示给用户? 第十二章(P230) 问题:为了让用户满意,是否可以在用户的原来基础上创新,体现出一些人文关怀,请问这是一些好的想法吗?还是这是程序员的顾忌?

阅读《构建之法》十一、十二、十三章之感

第十一章 问题:为了避免误解,我们是不是可以把我们理解的告诉用户,并且最好是图像的形势或是其他方式展示给用户? 第十二章 问题:为了让用户满意,是否可以在用户的原来基础上创新,体现出一些人文关怀,请问这是一些好的想法吗?还是这是程序员的顾忌? 第十三章 问题:(220)文中提到用户需要帮助,但是用户没有那么蠢.是一个人非常典型的例子,但是这个例子问题太过突出.有时候就算我们记住了用户的选择,考虑了用户的感受,但是还是难免把握住那住个度,那么我们如何准确的把握住那个度.

Gradle 1.12用户指南翻译——第三十一章. FindBugs 插件

其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://github.com/msdx/gradledoc/tree/1.12. 直接浏览双语版的文档请访问: http://gradledoc.qiniudn.com/1.12/userguide/userguide.html. 另外,Android 手机用户可通过我写的一个程序浏览文档,带缓存功能的,目前

计算机系统要素:第十一章 编译器:代码生成

一,项目介绍 终于来到了编译器部分的最后一个章节--代码生成阶段.本章的目标就是将Jack语言转化为VM语言,完成Jack编译器的构建. 刚刚接触这章的内容时,会比较难上手,最主要的问题就在于,这章的内容看起来和第十章没有什么关系.刚开始做这个项目时,我就很疑惑,第十章输出的不是一个结构化的xml文件吗?这个文件在第十一章根本不需要输出,那么这章的内容从何开始呢? 的确,这个xml文件是不需要输出的,但是第十章的目的并不单纯是输出这个xml文件,它更重要的目的是为了让我们了解如何对jack程序文

第十一章 分布式应用程序

第十一章分布式应用程序 使用网络的应用程序,称为分布式应用程序(distributed applications),现在,已经越来越重要.幸运的是,.NETBCL 和其他的库提供了许多结构,使得通过网络通信变得容易,进而,用 F# 创建分布式应用程序也是很简单. 网络概述 已有几类分布式应用程序,通常分为:客户端-服务器(client-server)应用程序,其中客户端向中央服务器的请求:点对点应(peer-to-peer)用程序,萨满教这里,计算机之间相互交换数据.这一章,我们将重点学习客户端

深入浅出Zabbix 3.0 -- 第十一章 VMware 监控

第十一章  VMware 监控 随着虚拟化技术应用的越来越广泛,Zabbix作为基础架构的监控系统,也可以很好的支持基于VMware的虚拟化平台及虚拟机进行监控.通过在Zabbix中预先定义的host prototypes(主机原型)利用low-level discovery rules会自动发现VMware hypervisors和虚拟机,并创建主机对它们进行监控. 在Zabbix中对虚拟机的监控分两步完成,首先,通过vmwarecollector实例收集虚拟机数据,这些实例使用SOAP协议从

[CSAPP笔记][第十一章网络编程]

第十一章 网络编程 我们需要理解基本的客户端-服务端编程模型,以及如何编写使用因特网提供的服务的客户端-服务端程序. 最后,我们将把所有这些概念结合起来,开发一个小的但功能齐全的Web服务器,能够为真实的Web浏览器提供静态的和动态的文本和图形内容. 11.1 客户端 - 服务器编程模型 每个网络应用程序都是基于客户端 - 服务器模型的 采用这种模型,一个应用是由一个服务器进程 和一个或多个客户端进程组成. 服务器管理某种资源,并且通过操作这种资源为它的客户端提供某种服务. WEB服务器,代表客