目录
8.7 shell 编程
8.7.1 shell 编程的基本过程
包含以下三步:
- 创建 shell 文件,即后缀名为 .sh 的文件
- 赋予 shell 文件执行权限,即使用 chmod 命令修改权限
- 执行 shell 文件,即在命令行调用 shell 文件
8.7.2 实例
r=4,w=2,x=1
若要rwx属性,则4+2+1=7
若要rw-属性,则4+2=6
若要r-x属性,则4+1=5
8.7.3 shell 程序和语句
shell 程序由零至多条 shell 语句构成。
shell 语句以下三大类:
- 说明性语句:以 # 号开始到行尾的部分,不被解释执行。
- 功能性语句:任意的 OS 命令、shell 内部命令、自编程序、其它 shell 程序名等。
- 结构性语句:条件测试语句、多路分支语句、循环语句、循环控制语句等。
8.8 说明性语句和功能性语句
8.8.1 说明性语句(注释行)
注释行可以出现在程序中的任何位置,既可以单独占用一行,也可以接在执行语句的后面。以 # 号开始到所在行的行尾部分,都不被解释执行。例如:
#! /bin/sh 告诉OS用哪种shell来解释执行程序
#
# 本程序说明
#
cmd1
cmd2 # cmd2的语句说明
8.8.2 常用的功能性语句
1、read 命令
read 从标准输入读入一行,并赋值给后面的变量。注意:执行 read 语句时,shell 程序将会等待你的一个标准输入,而一旦回车就代表输入结束,因此必须在一行中输入完毕。
把读入的数据全部赋给 var,语法格式如下:
read var
把读入行中的第一个参数赋给 var1,第二个参数赋给 var2,……,语法格式如下:
read var1 var2 var3
如果执行 read 语句时标准输入无数据,则程序在此停留等待,直到数据的到来或被终止运行:
当变量个数和参数个数不匹配时,将会把剩下的所有参数赋给最后一个变量:
2、expr 命令
算术运算命令 expr 主要用于进行简单的整数运算,包括:加 (+)、减 (-)、乘 (\*)、整除 (/) 和求模 (%) 等操作。例如:
$ expr 12 + 5 \* 3
27
$ expr 3 - 8 / 2
-1
$ expr 25 % 4
1
$ num=9
$ sum=`expr $num \* 6`
$ echo $sum
54
没有 expr 就不能进行算术运算:
8.9 结构性语句
结构性语句主要根据程序的运行状态、输入数据、变量的取值、控制信号以及运行时间等因素来控制程序的运行流程。主要包括以下几类语句:
- 条件测试语句(两路分支)
- 多路分支语句
- 循环语句
- 循环控制语句
无任何结构性语句的shell脚本程序是一种特例。
8.9.1 条件语句 if
语法结构:
if 表达式
then 命令表1
else 命令表2
fi
创建 test.sh 文件:
if [ -f file1 ]
then
echo "文件file1存在"
else
echo "文件file1不存在"
fi
- -f:如果 filename为常规文件,则为真
- -d:如果 filename为目录,则为真
- [ ]:和表达式两侧必须要有一个空格
执行 test.sh 文件:
初始由于没有为其赋予权限,因此执行失败,于是我们使用 chmod 命令修改其权限。
8.9.2 测试语句 test
test 语句可测试的三种对象:
- 字符串
- 整数
- 文件属性
test 命令测试的条件成立时,命令返回值为真(0),否则返回值为假(非 0)
① 用法一
name="anyujin"
test $name == $1
echo $?
② 用法二
if test -f file1
then
echo "文件file1存在"
else
echo "文件file1不存在"
fi
通常把 test 简写为 [ ] :
if [ -f file1 ]
即用方括号替代了 test 语句,注意方括号和表达式之间至少要有一个空格。
8.9.3 多路分支语句 case…esac
case 字符串变量 in
模式1)
命令表1
;;
模式2)
命令表2
;;
...
*)
命令表n
;;
esac
检查用户输入的文件名:
# 要求输入一个命令行参数
if [ $# -ne 1 ]
then
echo "One argument must be declared."
exit
fi
# 检查用户输入的文件
case $1 in
file1)
echo "User selects file1."
;;
file2)
echo "User selects file2."
;;
*)
echo "You must select either file1 or file2!"
;;
esac
执行上述 shell 程序:
8.9.4 循环语句 for…do…done
当循环次数已知或确定时,使用 for 循环语句来多次执行一条或一组命令。循环体由语句括号 do 和 done 来限定。格式为:
for 变量名 in 单词表
do
命令表
done
① 用法一
for num in "1" "3" "5"
do
echo "$num"
done
② 用法二
for num in {1..5}
do
echo "$num"
done
③ 用法三
# 判断并创建目录backup
if [ ! -d $HOME/backup ]
then
mkdir $HOME/backup
fi
# 修改工作路径
cd /home/envoutante/桌面
# 用flist存放当前目录的所有文件
flist=`ls`
# “图片18.png”
num=18
# 循环flist中的所有文件
for file in $flist
do
# 修改文件名
mv ${file} 图片${num}.png
file="图片${num}.png"
# 复制文件到backup
cp $file $HOME/backup
echo "$file copied"
# 计数器加一
num=`expr $num + 1`
done
echo '***Back up completed***'
8.9.5 循环语句 while…do…done
语法结构为:
while 命令或表达式
do
命令表
done
创建文件程序,参数 1 为文件名开头,参数 2 为创建个数:
8.9.6 循环控制语句 break 和 continue
break 语句从包含该语句的最近一层循环中跳出一层,break n 则跳出 n 层;
continue 语句则马上转到最近一层循环语句的下一轮循环上,continue n 则转到最近 n 层循环语句的下一轮循环上。