欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SHELL脚本编程_1

程序员文章站 2022-07-10 09:34:51
...

title: SHELL脚本编程_1
data: 2018-9-18
tags: [SHELL,脚本,编程,学习]
categories: [学习,SHELL]
grammar_cjkRuby: true
copyright: true

我已经了解了如何使用shell的命令行界面提示符来输入命令和查看命令的结果。shell脚本的优点在于输入多个命令并处理每个命令的结果,甚至需要将一个命令的结果传给另一个命令。shell可以让我将多个命令串起来,一次执行完成。


构建基本脚本

创建 shell 脚本文件

创建shell脚本文件时,必须在文件的第一行指定要使用的shell。其格式为:
#!/bin/bash
处第一行外,通常的shell脚本中,井号( # )用作注释行。

显示消息

在 echo 命令后面加上了一个字符串,该命令就能显示出这个文本字符串。

$ echo This is a test
This is a test
$

echo 命令可用单引号或双引号来划定文本字符串。如果在字符串中用到了它们,你需要在文本中使用其中一种引号,而用另外一种来将字符串划定起来。

如果想把文本字符串和命令输出显示在同一行中,可以用 echo 语句的 -n 参数。

echo -n "The time and date are: "
$ ./test1
The time and date are: Mon Feb 21 15:42:23 EST 2014

使用变量

环境变量

shell维护着一组环境变量,用来记录特定的系统信息。比如系统的名称、登录到系统上的用户名、用户的系统ID(也称为UID)、用户的默认主目录以及shell查找程序的搜索路径。可以用set 命令来显示一份完整的当前环境变量列表。在脚本中,你可以在环境变量名称之前加上美元符( $ )来使用这些环境变量。(你可能还见过通过${variable} 形式引用的变量。变量名两侧额外的花括号通常用来帮助识别美元符后的变量名。)

用户变量

用户变量可以是任何由字母、数字或下划线组成的文本字符串,长度不超过20个。用户变量区分大小写,所以变量 Var1 和变量 var1 是不同的。使用等号将值赋给用户变量。在变量、等号和值之间不能出现空格(另一个困扰初学者的用法)。举例:

var1=10
var2=-57
var3=testing
var4="still more testing"

shell脚本会自动决定变量值的数据类型。在脚本的整个生命周期里,shell脚本中定义的变量会一直保持着它们的值,但在shell脚本结束时会被删除掉。与系统变量类似,用户变量可通过美元符引用。

$ cat test3
#!/bin/bash
# testing variables
days=10
guest="Katie"
echo "$guest checked in $days days ago"
days=5
guest="Jessica"
echo "$guest checked in $days days ago"
$

运行脚本会有如下输出。

$ chmod u+x test3
$ ./test3
Katie checked in 10 days ago
Jessica checked in 5 days ago
$

变量每次被引用时,都会输出当前赋给它的值。重要的是要记住,引用一个变量值时需要使用美元符,而引用变量来对其进行赋值时则不要使用美元符。

命令替换

shell脚本中最有用的特性之一就是可以从命令输出中提取信息,并将其赋给变量。把输出赋给变量之后,就可以随意在脚本中使用了。这个特性在处理脚本数据时尤为方便。

  • 反引号字符( ` )
  • $() 格式
testing='date'
testing=$(date)

这个例子毫无吸引人的地方(也可以干脆将该命令放在 echo 语句中),但只要将命令的输出放到了变量里,你就可以想干什么就干什么了。

命令替换会创建一个子shell来运行对应的命令。子shell ( subshell)是由运行该脚本的shell所创建出来的一个独立的子shell(child shell)。正因如此,由该子shell所执行命令是无法使用脚本中所创建的变量的。
在命令行提示符下使用路径 ./ 运行命令的话,也会创建出子shell;要是运行命令的时候不加入路径,就不会创建子shell。如果你使用的是内建的shell命令,并不会涉及子shell。在命令行提示符下运行脚本时一定要留心!

数学运算

有了变量,有了数值就可以进行数学运算了。

expr 命令

expr 命令允许在命令行上处理数学表达式,但是特别笨拙。

$ expr 1 + 5
6
操作符 描述
ARG1 | ARG2 如果 ARG1 既不是null也不是零值,返回 ARG1 ;否则返回 ARG2
ARG1 & ARG2 如果没有参数是null或零值,返回 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 的值

对于那些容易被shell错误解释的字符,在它们传入 expr 命令之前,需要使用shell的转义字符(反斜线)将其标出来。比如 *

使用方括号

在bash中,在将一个数学运算结果赋给某个变量时,可以用美元符和
方括号( $[ operation ] )将数学表达式围起来。

$ var1=$[1 + 5]
$ echo $var1
6
$ var2=$[$var1 * 2]
$ echo $var2
12
$

bash shell数学运算符只支持整数运算。若要进行任何实际的数学计算,这是一个巨大的限制。

浮点数解决方案-bc计算机

bash计算器实际上是一种编程语言,它允许在命令行中输入浮点表达式,然后解释并计算该表达式,最后返回结果。bash计算器能够识别:

  • 数字(整数和浮点数)
  • 变量(简单变量和数组)
  • 注释(以#或C语言中的 /* */ 开始的行)
  • 表达式
  • 编程语句(例如 if-then 语句)
  • 函数
$ 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'.
12 * 5.4
64.8
3.156 * (3 + 5)
25.248
quit
$

要退出bash计算器,你必须输入 quit 。浮点运算是由内建变量 scale 控制的。必须将这个值设置为你希望在计算结果中保留的小数位数,否则无法得到期望的结果。-q 命令行选项可以不显示bash计算器冗长的欢迎信息。

$ bc -q
3.44 / 5
0
scale=4
3.44 / 5
.6880
quit
$

现在你可能想问bash计算器是如何在shell脚本中帮助处理浮点运算的。还记得命令替换吗?是的,可以用命令替换运行 bc 命令,并将输出赋给一个变量。基本格式如下:
variable=$(echo "options; expression" | bc)
举例:

$ cat test9
#!/bin/bash
var1=$(echo "scale=4; 3.44 / 5" | bc)
echo The answer is $var1
$

行了吧,我实在写不下去,前两天和我喜欢的女孩子分手了。这两天状态一直不好。我还爱她啊,只是异地恋太辛苦,实在没有坚持下去的勇气,愿上天让她幸福