本章内容:
- 使用多个命令
- 创建脚本文件
- 显示消息
- 使用变量
- 输入输出重定向
- 管道
- 数学运算
- 退出脚本
11.1 使用多个命令
shell脚本的关键在于输入多个命令并处理每个命令的结果,甚至需要将一个命令的结果传给另一个命令。如果要两个命令一起运行,可以把它们放在同一行中,彼此用分号隔开。
date ; who
2017年 06月 23日 星期五 09:59:02 CST
*** tty7 2017-06-04 11:34 (:0)
11.2 创建shell脚本文件
在创建shell脚本文件时,必须在文件的第一行指定要使用的shell。其格式为:
#!/bin/bash
在通常的shell脚本中,#可以用来注释行,除了以“#!”开头的第一行
完成脚本test1并保存后(我使用的是gedit),在shell中输入脚本名称,发现提示找不到命令。这是因为PATH中没有test1所在的路径。有两种方法解决问题:
1.将shell脚本文件所在的目录添加到PATH环境中
2.使用绝对路径或相对文件路径来引用shell脚本文件
第二种方法:
绝对路径(指从根目录开始)l@l-virtual-machine:~$ /home/l/script/test1
相对路径(当前目录 .) l@l-virtual-machine:~/script$ ./test1
中途还发生test1脚本的权限问题,因为test1脚本是在root用户下创建的,而我使用自己的账户在执行。所以要用chmod命令改变权限
11.3 显示消息
echo命令的功能是在显示器上显示一段文字,一般起到一个提示的作用。
该命令的一般格式为: echo [ -参数 ] 字符串
参数:-n 不要在最后自动换行
※ echo $PATH 可以显示环境变量
可以将echo语句加到shell脚本中任何需要显示额外信息的地方。
用echo正常输出引号的方法:
$ echo ‘Rich says “scripting is easy”.’
Rich says “scripting is easy”.
11.4 使用变量
变量允许你临时性地将信息存储在shell脚本中。
===
11.4.1 环境变量
可以用 set命令来显示一份完整的当前环境变量列表。
在脚本中,你可以在环境变量名称之前加上美元符号($)来使用这些环境变量。
echo UID: $UID
===
11.4.2 用户变量
用户变量区分大小写,所以变量Var1和变量var1是不同的。
#!/bin/bash
# assigning a variable value to another variable
value1=10
value2=$value1
echo The resulting value is $value2
输出结果是10
若 value2=value1,则输出value1
所以引用一个变量的值来给另一个变量赋值,也需要加上$符号
===
11.4.3 命令替换
从命令输出中提取信息,并将其赋给变量。
两种方式:
- 反引号字符
- $()格式
#!/bin/bash
#this script is used for display the date and the user
date
testing=$(who)
echo the user is $testing
输出:
2017年 06月 23日 星期五 11:14:43 CST
the user is l tty7 2017-06-04 11:34 (:0)
等号两端不能加空格!!!
11.5 重定向输入和输出
可以将命令的输出重定向到另一个位置(比如文件)。
11.5.1 输出重定向
bash shell用大于号(>)来完成这项功能: command > outputfile
之前显示器上出现的命令输出会被保存到指定的输出文件中。
$ date > test6
双大于号(>>)用于在原文件追加数据
===
11.5.2 输入重定向
输入重定向是小于号(<): command < inputfile
$ wc < test6
2 11 60
wc(words count?)命令会输出3个值:行数、词数、字节数
<< 这个连续两个小于的符号。 他代表的是『结束的输入字符』的意思!举例来讲:『我要用 cat 直接将输入的信息输出到 catfile 中, 且当由键盘输入 EOF 时,该次输入就结束』,那我可以这样做:
$ catfile << EOF
11.6 管道
command1 | command2
将command1的输出直接送到command2中
11.7 执行数学运算
在Bash shell环境中,可以利用 let、 (()) 、 [ ]、 expr 、 bc 进行数学运算
#! /bin/bash
echo "数学运算篇 START"
#基本运算----let
a=5;
b=4;
echo "a = $a , b = $b"
let c=a+b;
echo "a + b = $c"
let a++
echo "a++ = $a"
let b--
echo "b-- = $b"
let b+=a
echo "b+=a: b = $b"
#基本运算----[]
echo "a = $a, b = $b"
c=$[a+b]
echo "\$[a+b] = $c"
c=$[$a+$b]
echo "\$[\$a+\$b] = $c"
#基本运算----(())
c=$((a+b))
echo "\$((a+b))=$c"
#基本运算----expr
c=`expr 3 + 4` #注意+两侧的空格
echo "$c"
c=`expr $a + $b`
echo "$c"
#高级运算----bc
#1.计算浮点
echo "4 * 0.56" | bc
a=5.5
b=3.5
c=`echo "$a * $b" | bc`
echo "$a * $b = $c"
#2.设定小数精度
c=`echo "scale=3; $a * $b" | bc`
echo "scale=3; $a * $b = $c"
#3.进制转换
d=`echo "obase=2; $c" | bc`
echo "obase=2; $c = $d"
#4.高级函数
a=`echo "sqrt(100)" | bc`
echo "sqrt(100) = $a"
b=`echo "3^3" | bc`
echo "3^3 = $b"
echo "数学运算篇 END"
数学运算篇 START
a = 5 , b = 4
a + b = 9
a++ = 6
b-- = 3
b+=a: b = 9
a = 6, b = 9
$[a+b] = 15
$[$a+$b] = 15
$((a+b))=15
7
15
2.24
5.5 * 3.5 = 19.2
scale=3; 5.5 * 3.5 = 19.25
obase=2; 19.25 = 10011.0100000
sqrt(100) = 10
3^3 = 27
数学运算篇 END
11.7.3 浮点解决方案
var1=$(echo “scale=4; 3.44 / 5” | bc)
11.8 退出脚本
11.8.1 查看退出状态码
echo $?
===
11.8.2 exit命令
在脚本文件的最后写上 exit 5,则自定义了结束状态码5