Shelllinux

七、构建shell脚本

2018-05-29  本文已影响12人  Miridescent

简单目录

1.创建shell脚本

打开vim,开始写shell脚本
下面开始第一个简单的脚本

#!/bin/bash
# 输出当前日期
echo -n  输出日期
date

# 输出操作者
echo 输出操作者
who

上面的脚本运行后的结果是

[root@jdu4e00u53f7 msdir]# test1
-bash: test1: 未找到命令
[root@jdu4e00u53f7 msdir]# ./test1
输出日期2017年 08月 23日 星期三 15:29:31 CST
输出操作者
root     pts/0        2017-08-23 14:26 (221.217.181.233)

*注意 运行的时候,我直接输入test1会提示找不到命令,要用./test1执行脚本(也就是脚本的的位置),也可用命令/home/msdir/test1执行脚本

*注意 另一种执行脚本的做法是将脚本所处的目录添加到PATH环境变量中

上面就是一个简单的shell脚本,下面对内容做一下说明
1.在创建shell脚本的时候,必须在文件的第一行指定要使用的shell
2.通常在脚本中#表示注释行,但是只有在第一行的时候是例外
3.echo是输出文本字符串,当想让命令输出和文本字符串在一行的时候可以用参数-n,格式如脚本中的第三行
*注意 echo命令可以用单引号或者双引号来划定文本字符串,如果在字符串中用到单引号或双引号,用另外一种将字符串划定起来,例如要输出字符串Let's go,则如下

echo "Let's go"

例如要输出字符串say "come on!".
则如下

echo 'say "come on!".'

2.使用变量

前面讲到的shell中维护的这一组变量都可以直接在脚本中使用,只要在变量前加$符号即可,如下

echo PATH=$PATH

输出结果如下

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

查询有哪些变量可用,用set命令

*注意 如果想要输出$PATH的话可直接用\$转义,语句如下

echo \$PATH

在脚本中自定义用户变量直接通过=赋值即可
例如

var1=123
var2="我是一个变量"
var3=我也是一个变量
echo var1=$var1
echo var2=$var2
echo var3=$var3

输出结果如下

var1=123
var2=我是一个变量
var3=我也是一个变量

*注意 变量可由字母数字下划线组成,长度不超过20字符,区分大小写
*注意 变量赋值字符串时带引号和不带引号作用相同
*注意 可以通过$符号通过变量给变量赋值,例如var4=$var3

3.命令替换

从命令输出中提取信息,将其赋给变量,这样在脚本中就可以随意使用输出信息了,有两种方法
方法1 `字符(注意这是反引号字符,不是单引号)
用两个反引号将命令行围起来,例如:

testing=`date`
echo $testing

输出结果

2017年 08月 24日 星期四 16:21:54 CST

方法2 $()
例如:

testing2=$(date)
echo $testing2

输出结果

2017年 08月 24日 星期四 16:21:54 CST

4.重定向输入或输出

重定向将命令的输出发送到一个文件中 >

➜  date>test
➜  cat test
2018年 5月29日 星期二 16时00分28秒 CST

向文件末尾追加数据 >>

➜   who>>test
➜   cat test
2018年 5月29日 星期二 16时00分28秒 CST
a824810056 console  May  2 09:06 
a824810056 ttys000  May 25 10:06 
a824810056 ttys001  May 17 18:05 
a824810056 ttys002  May 28 14:17 

输入重定向<

➜  wc<test 
       5      25     184  

wc命令对数据中的文本进行计数,输出数据对应的是文本的行数、文本的词数、文本的字节数
内联输入重定向<<
看例子

➜ wc<<eof
heredoc> string1
heredoc> string2
heredoc> eof
       2       2      16

输入时有一个标记eof,直到在此遇到标记的时候表示输入终止

5.管道

当一个命令产生一个数据,然后该数据再被别的命令使用的时候,可以通过从定向输入和输出,通过一个中间文件达成目的
通过管道可以去掉中间文件的存在,在数据被第一个命令产生的时候直接被第二个命令使用
例如:

➜  date>test
➜  sort<test

和下面的功能是一样的

➜ date|shrt

*注意 管道不会产生任何中间文件和缓存
*注意 一条命令中可以使用多条管道
*注意 管道和重定向可同时使用

6.执行数学运算

expr命令

➜ expr 1 + 5
6

expr支持一些简单的运算符,但是问题来了,有一些运算符在脚本中有别的用途,例如*
解决这个问题,在运算符之前加转义字符\

➜  ~ expr 1 \* 5
5

但是整体来说,这样还是很麻烦,bash shell给出了另外一种在脚本中进行数学运算的方法$[]

➜  ~ var1=$[1 + 5]
➜  ~ echo $var1
6

该种方法也适用于脚本
bash shell中还有一个对于算术不友好的表现,就是不支持浮点数,往下看解决办法内建的bash计算器bc

➜  ~ bc
bc 1.06
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 

bc实际上是一种编程语言,支持数字(包括浮点数)、变量、注释、表达式、函数等
退出bc编程模式用quit命令
在bc中计算浮点数,要通过scale命令设置浮点经度,默认是0,看下面的例子

➜  ~ bc -q
2 / 5
0
scale = 4
2 / 5
.4000

看到,在没设置scale之前,是不显示小数点后面的值的
通过重定向在脚本中使用bc
看下面的例子,写一个脚本:

#!/bin/bash
  
var1=$(echo "scale=4;1 + 5"|bc)
echo 最终结果是:$var1

执行脚本

➜  ~ chmod u+x test 
➜  ~ ./test  
最终结果是:6

通过例子看到,可以通过管道,将多个表达式(用;分割)传输给bc执行计算
但是当表达式多行的时候,放在一条命令中似乎就不太友好了
可以通过内联重定向解决这个问题,看下面的脚本例子

#!/bin/bash
  
var1=11.11
var2=12
var3=13

var5=$(bc << eof
scale = 4
a1 = ($var1 + $var2)
a2 = ($var2 + $var3)
a1 + b1
eof
)
echo 最终结果是:$var5

执行脚本结果

➜  ~ ./test  
最终结果是:23.11

通过换行和标识符,给bc中传入多行表达式
*注意 bc内的变量不可以在shell脚本中使用

7.退出脚本

对于每个执行命令,shell可以通过$?命令查看退出状态

➜  ~ date
2018年 5月29日 星期二 17时53分35秒 CST
➜  ~ $?
zsh: command not found: 0

退出状态实际是一个数字,范围是0~255,有一些基本的参数,但是没有固定的标准
默认情况下shell脚本会以最后一条命令作为退出状态码
通过exit命令在脚本中自定义退出状态码,只要在脚本退出的时候自定义一下即可
*注意 退出状态范围是0~255,超出范围返回的状态码是255取余后的结果

上一篇下一篇

猜你喜欢

热点阅读