shell脚本本质:shell命令的有序集合
编译型语言、解释性语言:shell
1、创建shell文件(.sh)
2、赋予shell文件执行权限:用chmod修改权限
3、执行shell文件:直接在命令行调用shell程序
1、创建shell文件:
$ cat prog1.sh
date
2、赋予执行权限(初始文本文件无执行权限):
$ chmod 740 prog1.sh
3、执行该shell程序
$ prog1.sh
prog1.sh:not found
(shell在标准搜索路径中找不到prog1.sh)
4、指定路径或修改环境变量path后执行shell程序
$ ./prog1.sh
shell允许用户建立变量存储数据,但不支持数据类型(如:整形、浮点型),将任何赋给变量的值都解释为一串字符:
variable=value
$0 :与键入的命令行一样,包含脚本文件名
$1,$2…$9 :分别包含第一道第九个命令行参数
$# :包含命令参数的个数
$@ :包含所有命令行参数:“$1,$2,…$9”
$? :包含前一个命令的退出状态
$* :包含所有命令行参数:“$1,$2,…$9”
$ $ :包含正在执行进程的ID号
HOME:/etc/passwd文件中累出的用户主目录
IFS:internet field separator,默认为空格,tab及换行符
PATH:shell搜索路径
PS1,PS2:默认提示符$及换行提示符>
TERM:终端类型
shell程序由0或多条shell语句构成,shell语句包括:说明性语句、功能语句、结构性语句
说明性语句:以#开始到该行结束,不被解释执行
功能性语句:任意的shell命令,用户程序或其他shell程序
结构性语句:条件测试语句、多路分支语句、循环语句等
出现在任意位置,可单独占一行也可放在执行语句后,例如:
#! /bin/sh
#
#本程序说明
#
command_1
command_2 #command_2语句的说明
...........
#下面程序段的说明
command_m
command_n #commandn的说明
语法:
read var
把读入的数据全部赋值给var:
read var1 var2 var3
把读入行的第一个单词赋给var1,第二个但此次赋给var2…把其余所有的词赋给最后一个变量
注意:如果执行read语句时标准输入无数据,则程序在此停留等候到数据的到来或者被中止运行
简单的整数运算:加+、减-、乘*、整除/和求模%
例如:
$ expr 12 + 5 \* 3
27
$ expr 3 - 8 / 2
-1
$ num=9
$ sum= 'expr $num \* 6'
$ echo $ sum
54
test测试对象:字符串、整数、文件属性
每种测试对象都有若干测试操作符,例如:
test "$answer" = "yes"
# 变量answer的值是否为字符串yes
test $num -eq 18
# 变量num的值是否等于整数18
test -d tmp
# 测试tmp是否为一个目录名
s1 = s2 :测试两个字符串内容是否完全一样
s1! = s2 :测试两个字符串的内容是否有差异
-z s1 :测试s1字符串的长度是否为0
-n s1 :测试s1字符串的长度是否不为0
a -eq b :a、b是否相等(equal to)
a -ne b :a、b是否不相等(not equal to)
a -gt b :a是否大于b(greater than)
a -ge b :a是否大于等于b( greater than or equal to)
a -lt b : a是否小于b(less than)
a -le b :a是否小于等于b(less than or equal to)
-d name:测试name文件是否为一个目录
-e name:测试文件是否存在
-f name:测试name是否为普通文件
-L name:测试name是否为符号链接
-r name:测试name文件是否存在且为可读
-w name:测试name文件是否存在且为可写
-x name:测试name文件是否存在且为可执行
-s name:测试name文件是否存在且其长度不为0
f1 -nt f2:测试文件f1是否比文件f2更新
f1 -ot f2:测试文件f1是否比文件f2更旧
结构性语句主要根据程序的运行状态、输入数据、变量的取值、控制信号以及运行时间等因素来控制程序的运行流程。
主要包括:条件测试语句(两路分支)、多路分支语句、循环语句、循环控制语句和后台控制语句等
语法结构:
if 表达式
then
命令表
fi
若表达式为真,则执行,否则退出if语句执行fi之后的语句
if和fi必须成对使用
例如:在test命令中
方式1:
test $name -eq $1
echo $?
方式2:
if test -f $filename
then
......
fi
方式3:
if [ -f $filename]
then
.........
fi
case…esac
多路分支语句用于多重条件测试,语法为:
case 字符串变量 in #case语句只能检测字符串变量
模式1)
命令表1 #各模式中可用文件名元字符,以右括号结束
;;
模式2|模式3) #一次可以匹配多个模式用“|”分开
命令表2
;; #命令表与单独的双分号结束,退出case语句
........
模式n) #模式n常写为字符*表示所有其他模式
命令表n
;; #最后一个双分号可省略
esac
循环体由语句括号do和done来限定,格式:
for 变量名 in 单词表
do
命令表
done
语法结构:
while 命令或表达式
do
命令表
done
function(){
}
例如:建立一个fun函数
vi fun.sh
#!/bin/bash
fun(){
echo "hello world"}
fun
$ chmod 740 fun.sh
$ ./fun.sh
再例如:
#!/bin/bash
fun(){
A=$1
B=$2
C=$3
echo "hello world"
NUM='expr $A + $B + $C'
echo "NUM=$NUM"
return $NUM}
fun 1 2 3
echo "\$?=$?"