Shell脚本的本质
- 编译型语言(c)
- 解释型语言
shell脚本语言是解释型语言
shell脚本的本质:shell命令的有序集合
shell编程的基本过程
- 创建.sh的shell文件
包含任意多行操作系统命令或shell命令的文本文件 - 赋予shell文件执行权限
chomd命令修改权限 - 执行shell文件
直接在命令行上调用shell程序
shell变量
shell将任何变量的值都解释为一串字符串
echo打印shell变量的时候,需要在变量前加$符
Bourne Shell有如下四种变量
-
用户自定义变量
建议shell变量大写
unset 变量:清除变量值 -
位置变量(命令行参数)
-$0:与键入的命令行一样,包含脚本文件名
-$1,$2…$9:分别包含第一个到第九个命令行参数
-$@:包含所有命令行参数
-$*:等价于$@
-$# 命令行输入参数个数 -
预定义变量
-
环境变量
export:查看所有环境变量
env:查看环境变量
shell程序和语句
包括三类语句
说明性语句
#号标识的语句为说明语句,不被解释执行
脚本中第一行对脚本语句是有影响的:
**#!/bin/sh**
该句用于告诉OS用哪种类型的shell来解释执行该程序
功能性语句
shell命令、用户程序
read
read 从标准输入读入一行,并赋值给后面的变量,需要注意的是,输入的所有都被保存成字符串,包括空格
如何实现不换行?
#!/bin/bash
echo -n "input a number:" #在bash中
#!/bin/sh
echo "input a number:\c" #在sh中
expr
expr命令是一个手工命令行计数器,用于在UNIX/LINUX下求表达式变量的值,一般用于整数值,也可用于字符串
#!/bin/bash
VALUE='expr 2 + 3 \* 2' #运算符和数字之间要有空格隔开,否则报错
echo $VALUE
test
test语句测试三种对象:字符串、整数、文件属性
字符串
test “$answer” = “yes”
!=:两字符串是否有差异
-z s1:测试s1是否长度为0
-n s1:测试s1是否长度不为0
整数
test $num -eq 18
-ne:是否不等
-gt:是否大于后者
-ge:是否大于等于后者
-lt:是否小于后者
-le:是否小于等于后者
文件属性
test -d tmp
-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…then…elif…else…fi
read V
case $V in
yse | Yes | YES | y | Y)
...
;;
no)
...
;;
*)
...
;;
esac
循环语句for
#!/bin/bash
#for 变量名 in 单词表
# do
# 命令表
# done
#变量一次取单词表中的各个单词,每取一次单词,就执行一次循环体中的命令。循环次数由单词表中的单词数确定。命令表中的命令可以是一条或由分号或换行符分开的多条
#如果单词表示命令行上的所有位置参数时,
#for I in 1 2 3 4 5
#example1
for I in 'ls /dev'
do
echo "$I"
done
#example2
SUM=0
for I in 'seq 1 100'
do
SUM='expr $SUM + $I'
done
echo $SUM
#example3
for ((I = 1;I <= 10; I++))
do
echo "I=$I"
done
#example4
for ((;;))
do
echo "for"
done
循环语句while
#!/bin/bash
#while 表达式或命令
#do
# 命令表
#done
shell函数调用
(vim中输入:vsp file)
调用格式:
1、ret=‘function_name [ ]’ #该函数的所有标准输出都传递给主程序的变量(ret)
2、function_name [ ]
echo $? #获取函数返回
全局变量:创建变量默认都为全局变量
局部变量:在变量前添加local