热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

构建脚本

2019独角兽企业重金招聘Python工程师标准构建脚本10.1使用多个命令shell脚本的关键在于输入多个命令,并处理命令的结果,即使有可能将一

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

构建脚本

10.1 使用多个命令

shell脚本的关键在于输入多个命令,并处理命令的结果,即使有可能将一个命令的结果传给另一个命令。

如果两个命令一起运行,可在同一提示行输入它们,用分号分隔开。

  • 命令列表:在命令行中输入 date;who 命令
  • 进程列表:在命令行中输入(date;who) 命令

[root@centos1 ~]# date ; who
Sat Dec 9 10:39:17 CST 2017
root pts/0 2017-12-09 10:01 (192.168.20.224)

10.2 创建shell脚本文件

要将shell命令放到一个文本文件中。在创建shell脚本文件时,必须在文件的第一行制动要使用的shell 其格式为:

#!/bin/bash

在通常的shell脚本里, 井号 #  用作注释行。 shell脚本 注释行是不被shell执行的。然而,shell脚本文件的第一行是个特例,井号后接叹号 告诉shell用哪个shell来运行脚本。

在指定了shell之后可在文件的每行输入命令,然后加一个回车符。之前提到过,注释可用井号添加 。

以# 号 开头的行都不会被shell处理 出了以(#!开头的第一行) 。

chmod u+x abc

10.3 显示消息

在bash脚本中可以使用echo 命令打印输出:

[root@centos1 ~]# echo This is a test
This is a test

如果在字符串中出现引号的话就可能比较麻烦,echo 命令可用单引号或使用双引号来将文本字符串圈起来。如果你再文本中使用一种引号,二用另外一种来将字符串圈起来:

[root@centos1 ~]# echo "Lets's go"
Lets's go

[root@centos1 ~]# cat abc
#!/bin/bash
echo "The time and date are:"
date;
who
[root@centos1 ~]# ./abc
The time and date are:
Sat Dec 9 11:05:23 CST 2017
root pts/0 2017-12-09 10:01 (192.168.20.224)

如果想在同一行显示一个文本字符串作为命令输出:可以使用echo -n 参数,只要将第一个echo语句改为这样就行。

[root@centos1 ~]# cat abc
#!/bin/bash
echo -n "The time and date are:"
date;
who
[root@centos1 ~]# ./abc
The time and date are:Sat Dec 9 11:07:16 CST 2017
root pts/0 2017-12-09 10:01 (192.168.20.224)

完美! echo 命令是shell脚本中桶用户交互的重要工具。

10.4.1 环境变量

[root@centos1 bash_dir]# cat test2
#!/bin/bash
echo "User info for userid : $USER"
echo UID : $UID
echo HOME : $HOME
[root@centos1 bash_dir]# ./test2
User info for userid : root
UID : 0
HOME : /root

注意,echo命令中的环境变量会在银杏是替换成当前值。还有在第一个字符串中我们可以将$USER系统变量放置到双引号中,而shell依然能够知道我们的意图。采用这种方式也有一个问题,看看下面这个例子会怎样。

[root@centos1 bash_dir]# echo "The $15"
The 5

显然这不是我们想要的,要显示美元符,你必须在前面防止一个反斜线:

[root@centos1 bash_dir]# echo "The \$15"
The $15

反斜线允许shell脚本将美元符解释为实际的美元符,而不是变量。下一节将会介绍如何在脚本中创建自己的变量。

你可能还见过${variable} 形式引用的变量。变量名两侧额外的花括号通常用来帮助识别美元符后的变量名。

10.4.2 用户变量

除了环境变量,shell脚本还允许在脚本定义和使用自己的变量,定义变量允许临时存储数据并在整个脚本中使用,从而使shell脚本看起来更像计算机程序。

用户变量可以是任何不超过20个字母,数字或 下划线的文本字符串。 用户变量区分大小写,所以变量Var1和变量var1 是不同的。

值通过等号赋给用户变量。在变量、等号和值之间不能出现空格

  • var1=10
  • var2=-57
  • var3=testing
  • var4="Still more testing"

shell脚本会自动决定变量值的数据类型。在shell脚本的整个生命周期里,shell脚本中定义的变量会一致保持着它们的值,但在shell脚本完成时删除掉。

[root@centos1 bash_dir]# cat test3
#!/bin/bash
days=10
guest="Katie"
echo $guest "checked in $days"
[root@centos1 bash_dir]# ./test3
Katie checked in 10

10.4.3 反引号

shell脚本中最有用的特性之一就是反引号(`) .在shell脚本之外很少用到它,反引号允许你将shell命令的输出赋给变量。

你必须用反引号把这个命令行命令圈起来:

[root@centos1 bash_dir]# testing=`date`; echo $testing
Sat Dec 9 11:37:43 CST 2017
[root@centos1 bash_dir]# echo $testing
Sat Dec 9 11:37:43 CST 2017
[root@centos1 bash_dir]# (test=`date`; echo $test)
Sat Dec 9 11:38:31 CST 2017
[root@centos1 bash_dir]# echo $test[root@centos1 bash_dir]#

  1. 第一个定义命令列表,是在当前session中定义的用户变量
  2. 第二个是定义的进程列表,新创建一个进程,在进程里定义用户变量,出了该进程范围则输出为空

在脚本中通过反引号获得当前日期用用它来生成唯一文件名:

[root@centos1 bash_dir]# cat var1
#!/bin/bash
today=`date +%y%m%d`
ls /usr/bin -al > log.$today
[root@centos1 bash_dir]# ls
abc log.171209 test2 test3 var1

10.5 重定向输入和输出

有些时候你想要保存某个命令的输出而非在显示器上显示它。 bash shell提供了一些不同的操作符来将某个命令的输出重定向到另一个位置(比如文件)。重定向可以通过将某个文件重定向到某个命令上来用在输入上, 也可以用在输出上。

10.5.1 输出重定向

重定向最基本的类型是将命令的输出发到一个文件中。 bash shell采用大于号(>) 来完成这个功能

command > outputfile

之前显示器上出现的命令的输出会被保存到指定的输出文件中。

[root@centos1 bash_dir]# date > test3
[root@centos1 bash_dir]# cat test3
Sat Dec 9 11:51:58 CST 2017

重定向操作符创建了一个文件test3(通过默认的umusk设置), 如果输出文件已存在了,则这个重定向操作符会用新的文件数据覆盖已存在的文件

有时需要将命令的输出追加到已有文件上 可以用双大于号(>>) 来追加数据:如果文件不存在则创建。

date >> test4 

10.5.2  输入重定向

输入重定向和输出重定向正好相反。输入重定向将文件的内容重定向到命令,而非将命令的输出重定向到文件。

输入重定向符号是小于号(<) :

command 

[root&#64;centos1 bash_dir]# wc test24 16 82 test2
[root&#64;centos1 bash_dir]# wc

wc 命令提供了对数据中文本的计数。 默认情况下&#xff0c;它会输出3个值&#xff1a;

  • 文本行数
  • 文本词数
  • 文本的字节数

通过将文本文件重定向到 wc 命令。

还有一种输入重定向的方法&#xff0c;成为内联输入重定向。 这种方法允许你在命令行&#xff0c;而不是在文件指定输入重定向的数据。内联输入重定向符号是双小于号(<<)。除了这个符号&#xff0c;你必须指定一个文本标记来划分要输入数据的开始和结尾。 你可以用任何字符串的值来作为文本标记。但在数据的开始和结尾必须一致&#xff1a;

command < data
marker

在这个命令行上使用内敛输入重定向时&#xff0c;shell会用PS2 环境变量中定义的次提示符&#xff0c;来提示输入数据。下面是使用它的情况&#xff1a;

[root&#64;centos1 bash_dir]# wc <> aksjfd
> kajsdl
> lakjsdlfl
> askdfl
> lskfks
> s
> lksdf
> EOF7 7 46
[root&#64;centos1 bash_dir]# wc <> ksjdfk
> ksdjfk
> iwerui
> aa3 3 21

次提示符会一直提示输入更多的数据&#xff0c;知道你输入了作为文本标记的那个字符串值。wc 命令会对内联输入重定向提供的数据执行 行 词  和字节计数。

10.6  管道

有时你需要发送某个命令的输出作为另一个命令的输入。可以用重定向&#xff0c;会有些笨拙

rpm -qa > rpm.list
sort

先输出linux系统上安装文件的列表到rpm.list文件中。

然后排序文件中的内容。

类似于反引号(&#96;) 管道的符号在 shell编程之外也很少用到。管道放在命令键&#xff0c;将一个命令的输出重定向到另一个上&#xff1a; command1 | command2

不要以为管道连接会一个一个地运行&#xff0c;Linux系统实际上会同时运行这两个命令&#xff0c;在系统内部将它们连接起来。在第一个命令产生输出的同时&#xff0c;输出会被立即送到第二个命令。传输数据不会用到任何中间文件或缓冲区。

[root&#64;centos1 bash_dir]# rpm -qa | sort

可以在一条命令中使用任意多条管道&#xff0c;可以继续将命令的输入通过管道传给其他命令来简化操作。

[root&#64;centos1 bash_dir]# rpm -qa | sort | more

 

10.7 执行数学运算

在shell脚本中有两种痛经进行数学运算操作

10.7.1 expr命令 

可以处理数学表达式&#xff0c;但是特别笨拙。

var1&#61;&#96;expr 1/2&#96;

10.7.2 使用方括号

bash shell 为了保持跟Boume shell的兼容而包含了expr命令。但它同样也提供了一个执行数学表达式的更简单的方法。 bash中 将一个数学运算结果赋给某个变量时&#xff0c;你可以用美元符和 方括号($[operation]) 将数学表达式圈起来&#xff1a;

[root&#64;centos1 bash_dir]# (var&#61;$[1 &#43; 5];echo $var)
6
[root&#64;centos1 bash_dir]# (var&#61;$[1 &#43; 5];echo $var ; var2&#61;$[$var * 2]; echo $var2)
6
12

同样&#xff0c;注意在使用方括号来计算公式时&#xff0c;不用担心shell会误解乘号或其他符号&#xff0c;shell知道它不是通配符&#xff0c;因为它在方括号内。

bash shell数学运算只支持整数&#xff0c;如果要进行任何数学运算&#xff0c;这是一个巨大的限制。

10.7.3 浮点解决方案

使用内建的bash计算器&#xff0c;称作bc。

1.bc的基本用法

bash计算器其实是允许在命令行输入浮点表达式、解释表达式、计算并返回结果的一种编程语言。bash计算器能够识别&#xff1a;

  • 数字&#xff08;整数和浮点数&#xff09;
  • 变量&#xff08;简单变量和数组&#xff09;
  • 注释&#xff08;以# 开始IDE行或 C语言中的/* */对&#xff09;
  • 表达式
  • 编程语句&#xff08;例如if-then语句&#xff09;
  • 函数

你可以在shell提示符下通过bc命令访问bash 计算器&#xff1a;

[root&#64;centos1 bash_dir]# 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 &#96;warranty&#39;.
12 * 54
648
12 * 5.4
64.8
3.156 * (3&#43;5)
25.248
quit

浮点运算是由一个内建的成为scale的变量控制的。你必须将这个字设置为结果里你想要的小数后的位数&#xff0c;否则你不会得到想要的结果的&#xff1a;

[root&#64;centos1 bash_dir]# bc -q
3.44/5
0
scale&#61;4
3.44/5
.6880
quit
[root&#64;centos1 bash_dir]#

scale变量默认值是0 &#xff0c; 在scale值被设置前&#xff0c;bash计算器提供的答案没有小数点后的位置。在将其设置为4之后&#xff0c;bash计算器显示的答案有4位小数。-q命令行参数会将bash计算器输出的很长的欢迎条屏蔽掉。

出了普通数字&#xff0c;bash计算器还能支持变量&#xff1a;

[root&#64;centos1 bash_dir]# bc -q
var1&#61;10
var*4
0
var1*4
40
var2&#61;var1/5
print var2
2
quit
[root&#64;centos1 bash_dir]#

2.在脚本中使用bc

可以使用反引号来运行bc命令并将输出赋给一个变量。

variable&#61;&#96;echo "options;expression" | bc&#96;

[root&#64;centos1 bash_dir]# (variable&#61;&#96;echo "scale&#61;4;3.44/5" | bc&#96;; echo $variable)
.6880

 这里有个在脚本中使用它的例子&#xff1a;

[root&#64;centos1 bash_dir]# cat calculate
#!/bin/bash
var1&#61;&#96;echo "scale&#61;4;3.44/5" | bc&#96;
echo "The answer is $var1"
[root&#64;centos1 bash_dir]# ./calculate
The answer is .6880
[root&#64;centos1 bash_dir]#

这个例子在scale变量设置成了四位小苏&#xff0c;并未表达式指定了特定的运算。

[root&#64;centos1 bash_dir]# cat varcalcu
#!/bin/bash
var1&#61;100
var2&#61;45
var3&#61;&#96;echo "scale&#61;4;$var1/$var2" | bc&#96;
echo "The answer for this is $var3"
[root&#64;centos1 bash_dir]# ./varcalcu
The answer for this is 2.2222
[root&#64;centos1 bash_dir]#

脚本中定义了两个变量&#xff0c;它们都可以用在表达式中发送给bc命令。使用美元符来表示变量的值而不是变量自身&#xff0c;这个脚本输出如下&#xff1a;

这个方法适用于较短的运算&#xff0c;但有时你会更多地和你自己的数字打交道。如果你有很多运算&#xff0c;在同一个命令行中列出多个表达式就会有点麻烦。

针对这个问题有个解决办法。bc命令能够识别输入重定向&#xff0c;允许你将一个文件重定向到bc命令来处理。然而这样也叫人困惑&#xff0c;因为你必须将表达式存储到文件中。

最好的办法是使用内联输入重定向&#xff0c;允许你直接在控制台重定向数据。在shell脚本中&#xff0c;你可以将输出赋给一个变量&#xff1a;

variable&#61;&#96;bc <options
statements
expressions
EOF
&#96;

EOF文本 字符串标识了内联重定向数据的开始和结尾。记住仍然需要反引号来将bc命令的输出赋给变量

[root&#64;centos1 bash_dir]# cat eof
#!/bin/bash
var1&#61;10.46
var2&#61;43.67
var3&#61;33.2
var4&#61;71
var5&#61;&#96;bc <scale&#61;4
a1&#61;$var1*$var2
b1&#61;$var3*var4
a1&#43;bc
EOF
&#96;
echo "The final answer for this mess is $var5"
[root&#64;centos1 bash_dir]# ./eof
The final answer for this mess is 456.7882

将每个选项和表达式放在脚本中不同的行中&#xff0c;可以让事情变得更清晰&#xff0c;也更容易阅读和跟进。EOF字符串标识了内联重定向给bc命令数据的起始和结尾。当然&#xff0c;你也要用反引号来标识输出要赋给变量的命令

bash运算器中创建的变量只在bash计算器中有效&#xff0c;不能再shell脚本中使用。

10.8 退出脚本

我们的实例脚本那种总是匆忙结尾&#xff0c;在运行完最后一条命令时&#xff0c;就结束了脚本。这里还有一个更好的结束事情的办法。

shell中运行的每个命令都是使用退出状态码(exit status) 来告诉shell它完成了处理。退出状态码是一个0~255 之间的整数值&#xff0c;在命令结束运行时由命令传给shell&#xff0c;你可以捕获这个值并在脚本中使用。

10.8.1 查看退出状态码

Linux提供了 $? 专属变量来保存上个执行的命令的退出状态码。必须在要查看的命令之后马上查看或使用$?变量。它的值会变成shell中执行的最后一条命令的退出状态码&#xff1a;

[root&#64;centos1 bash_dir]# date
Sat Dec 9 14:57:41 CST 2017
[root&#64;centos1 bash_dir]# echo $?
0
[root&#64;centos1 bash_dir]#

[root&#64;centos1 bash_dir]# sdkjf
-bash: sdkjf: command not found
[root&#64;centos1 bash_dir]# echo $?
127
[root&#64;centos1 bash_dir]#

无效命令会返回一个退出状态码127 。Linux错误退出状态码没有什么标准惯例。但有一些可用的参考&#xff0c;如下

150000_mBqD_3101476.png

[root&#64;centos1 bash_dir]# date %t
date: invalid date &#96;%t&#39;
[root&#64;centos1 bash_dir]# echo $?
1
[root&#64;centos1 bash_dir]#

10.8.2 exit命令

默认情况下&#xff0c;shell脚本会以脚本中的最优一个命令的退出状态码退出&#xff1a;

[root&#64;centos1 bash_dir]# ./eof
The final answer for this mess is 456.7882
[root&#64;centos1 bash_dir]# echo $?
0
[root&#64;centos1 bash_dir]#

你可以改变这个来返回你自己的退出状态码。exit命令允许你再脚本结束时指定一个退出状态码&#xff1a;

[root&#64;centos1 bash_dir]# cat test10
#!/bin/bash
var1&#61;20
var2&#61;10
var3&#61;&#96;bc <$var1&#43;var2
EOF
&#96;
echo "The answer is $var3"
exit 5
[root&#64;centos1 bash_dir]# ./test10
The answer is 20
[root&#64;centos1 bash_dir]# echo $?
5

也可以在exit命令的参数中使用变量

exit $var

需注意使用exit时 参数值最大只能255 。 结果值是指定的数被256除的余数。 如果参数为300 余数则为44&#xff0c;它就成了最后的状态退出码。

 

 

 

 

 

 


转:https://my.oschina.net/LucasZhu/blog/1587241



推荐阅读
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文是关于C#类型系统、值类型和引用类型的概念性笔记。介绍了C#1系统类型的三个特性,静态类型的含义,显式类型和隐式类型的区别。还讨论了类、结构、数组类型、枚举、委托类型和接口类型属于哪一种类型。同时纠正了关于结构、引用类型和对象传递的错误表述。最后提到了C#4中使用动态类型的关键字。 ... [详细]
  • C语言常量与变量的深入理解及其影响
    本文深入讲解了C语言中常量与变量的概念及其深入实质,强调了对常量和变量的理解对于学习指针等后续内容的重要性。详细介绍了常量的分类和特点,以及变量的定义和分类。同时指出了常量和变量在程序中的作用及其对内存空间的影响,类似于const关键字的只读属性。此外,还提及了常量和变量在实际应用中可能出现的问题,如段错误和野指针。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • switch语句的一些用法及注意事项
    本文介绍了使用switch语句时的一些用法和注意事项,包括如何实现"fall through"、default语句的作用、在case语句中定义变量时可能出现的问题以及解决方法。同时也提到了C#严格控制switch分支不允许贯穿的规定。通过本文的介绍,读者可以更好地理解和使用switch语句。 ... [详细]
  • 导出功能protectedvoidbtnExport(objectsender,EventArgse){用来打开下载窗口stringfileName中 ... [详细]
  • HTML5网页模板怎么加百度统计?
    本文介绍了如何在HTML5网页模板中加入百度统计,并对模板文件、css样式表、js插件库等内容进行了说明。同时还解答了关于HTML5网页模板的使用方法、表单提交、域名和空间的问题,并介绍了如何使用Visual Studio 2010创建HTML5模板。此外,还提到了使用Jquery编写美好的HTML5前端框架模板的方法,以及制作企业HTML5网站模板和支持HTML5的CMS。 ... [详细]
  • REVERT权限切换的操作步骤和注意事项
    本文介绍了在SQL Server中进行REVERT权限切换的操作步骤和注意事项。首先登录到SQL Server,其中包括一个具有很小权限的普通用户和一个系统管理员角色中的成员。然后通过添加Windows登录到SQL Server,并将其添加到AdventureWorks数据库中的用户列表中。最后通过REVERT命令切换权限。在操作过程中需要注意的是,确保登录名和数据库名的正确性,并遵循安全措施,以防止权限泄露和数据损坏。 ... [详细]
  • JavaScript简介及语言特点
    本文介绍了JavaScript的起源和发展历程,以及其在前端验证和服务器端开发中的应用。同时,还介绍了ECMAScript标准、DOM对象和BOM对象的作用及特点。最后,对JavaScript作为解释型语言和编译型语言的区别进行了说明。 ... [详细]
author-avatar
隐姓埋名er
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有