SHELL脚本编程_1


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
$

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

猜你喜欢

转载自blog.csdn.net/qq_40420322/article/details/83859318