首页 > 代码库 > 构建基本脚本(第十一章)

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

1.1 多命令;

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

[root@localhost ~]# 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脚本中引用环境变量,例如如下脚本

[root@localhost ~]# 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
[root@localhost ~]# chmod a+x test.sh 
[root@localhost ~]# ./test.sh 
This user UID is:0
The homedir is:/root

1.4.2 用户变量

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

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

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

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

1.4.3 命令替换

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

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

[root@localhost ~]# var1=`date`
[root@localhost ~]# echo $var1
Tue Jul 18 09:29:33 CST 2017

var2=$(date):同上

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

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执行

[root@localhost ~]# wc <test1
 1  5 36

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

[root@localhost ~]# wc << EOF
> test1
> test2
> test3
> EOF
 3  3 18


1.5 管道命令|

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

[root@localhost ~]# ls |wc
     13      13     125


1.6 数学运算

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

示例:

[root@localhost ~]# expr 1 + 5
6

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

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

[root@localhost ~]# expr 1 \| 2
1
[root@localhost ~]# 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 方括号运算$[]

示例:

[root@localhost ~]# var1=$[1+5]
[root@localhost ~]# echo $var1
6


1.6.3 let运算表达式

示例:

[root@localhost ~]# let var1=1+2
[root@localhost ~]# echo $var1
3


1.6.4 $(())运算表达式

示例:

[root@localhost ~]# var=$((2+2))
[root@localhost ~]# echo $var
4


1.6.5 增强型赋值符

+=    -=    *=    /=    %=

[root@localhost ~]# let count+=1
[root@localhost ~]# echo $count
1
[root@localhost ~]# let count+=1
[root@localhost ~]# echo $count 
2


1.6.7 自增自减

++:自增

--:自减


1.6.8 浮点运算

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

[root@localhost ~]# 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:静默模式,可以省略提示信息

[root@localhost ~]# bc -q
5.5+6.342
11.842
quit

bc支持变量运算

[root@localhost ~]# bc -q
var=10.123
var1=342.32
var+var1
352.443
quit

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

[root@localhost ~]# bc -q
5/3
1
scale=3
5/3
1.666
quit

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

[root@localhost ~]# var=$(echo "scale=4;5 / 3" | bc)
[root@localhost ~]# echo $var
1.6666
[root@localhost ~]# 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
[root@localhost ~]# ./test.sh 
var is 3.333

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

[root@localhost ~]# 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
[root@localhost ~]# ./test.sh 
var5 is 4533.63


1.7 退出脚本

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

[root@localhost ~]# echo $?
0
[root@localhost ~]# ssldkf
bash: ssldkf: command not found...
[root@localhost ~]# echo $?
127

常见的退出码含义:

0     命令成功结束

1     一般性未知错误

2     不适合的shell命令

126     命令不可执行

127     没找到命令

128     无效的退出参数

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

130     通过Ctrl+C终止的命令

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


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

[root@localhost ~]# 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
[root@localhost ~]# ./test.sh 
var5 is 4533.63
[root@localhost ~]# echo $?
10

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


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

[root@localhost ~]# vi test.sh 
#!/bin/bash
var1=10
var2=300
var3=$[ $var1 * $var2 ]
echo "var3 is $var3"
exit $var3
~                                                                                                      
~                                                                                                                                                                                                    
~                                                                                                      
~                                                                                                      
~                                                                                                      
"test.sh" 6L, 85C written
[root@localhost ~]# ./test.sh 
var3 is 3000
[root@localhost ~]# echo $?
184


本文出自 “学海无涯” 博客,谢绝转载!

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