准备工作
不要把shell脚本命名为test,因为在Linux中已经有一个名为test的实用程序。首先要使shell找到脚本程序,有三种方法:
1. 将shell脚本文件所在的路径添加到PATH环境变量中
2. 在命令行中使用文件的绝对路径或相对路径运行,不过得修改权限,如命名一个脚本文件为hello,然后修改权限才能运行
3. 同二,命名一个文件为hello.sh,用 sh hello.sh即可
显示消息
脚本第一行一定定要写上 #!/bin/bash ( 表明使用的shell类型);接着都知道脚本程序运行时会打印很多输出,使用 echo 打印输出
使用变量
环境变量
使用set可以显示活动环境变量的完整列表,使用$符号可取值,看一个简单的脚本(脚本中经常需要打印输出自己的工作环境)
#!/bin/bash
echo UID: $UID
echo HOME: $HOME
用户变量
val1=10
val2=-10
val3=hello
val4="hello"
shell脚本自动为变量值确定数据类型(字符串),若要引用得需要$
反引号
反引号允许将shell命令的输出赋值给变量,见程序(这是一种为了日志文件名提取日期的常用技术)
#!/bin/bash
today=`date +%y%m%d`
ls /usr/bin -al > log.$today
重定向输入输出
输入重定向,是把一个文件内容重定向到一个命令中,格式command < inputfile,还有一种重定向:
内置重定向,这种重定向允许在命令行中而非文件中为输入重定向指向数据,使用方式如下,符号<<,但在开头和末尾都必须使用相同的文件标记
comman << marker(常使用EOF)
data
marker(常使用EOF)
#例如
wc << EOF
> test string 1
> test string 2
> test string 3
> EOF
数学计算
expr命令允许处理命令行中的等式,如下
expr 1 + 5 #必须得分开写,不然会被识别为一个
expr 5 * 2(错误)
expr 5 \* 2 (使用转义字符)
再看一个程序
#!/bin/bash
var1=10
var2=20
var3=`expr $var2 / $var1`
echo the result is $var3
更常用的是使用[]和$即可进行数学计算,如下
#!/bin/bash
var1=100
var2=50
var3=45
var4=$[$var1*($var2-$var3)]
echo the result is $var4
但注意Bash shell的数学操作只支持整数算法
浮点解决方案
为了解决上诉只能进行整数的问题,常用的是用内置的bash计算器(bc),退出须输入quit。
浮点算术被称为scale的内置变量控制。(scale 是设小数位数的,默认为0)
在脚本中使用bc的基本格式为:
var=`echo “options; expression” | bc`
下面在脚本中使用bc,此例子设置4位小数
#!/bin/bash
var1=100
var2=45
var3=`echo " scale=4; $var1 / $var2 " | bc`
echo the answer is $var3
对于简短的计算这种方法很好,但有时数字会很多。如果有多个计算,就会很乱,因此可以有两种解决方案
1. 使用重定向,允许把一个文件重定向到bc命令
2. 使用内置重定向
看一个使用内置重定向的例子
#/bin/bash
var1=10.46
var2=43.76
var3=33.2
var4=71
var5=`bc << EOF
scale = 4
a1 = ($var1 * $var2)
b1 = ($var3 * $var4)
a1 + b1
EOF
`
echo the answer is $var5
退出脚本
每条在shell中运行的命令都使用一个退出状态,这个退出状态是一个介于0~255之间的整数值,每当命令运行完时,命令就会把退出状态传递给shell。
可以使用$?来查询,如运行完一条命令后可以使用echo $?来查看,下面列举一些常见的推出值
0:命令成功完成
1:通常的未知错误(如提供一个无效的参数)
2:误用的shell命令
126:命令无法执行(用户没有权限)
127:没有找到命令(命令不存在)
128:无效的退出参数
130:Ctrl+C终止的命令
默认情况下,shell脚本以脚本中最后一条命令的退出状态退出,当然你可以使用exit命令更改退出状态码。