目录
8.7 shell 编程
8.7.1 shell 编程的基本过程
8.7.2 实例
8.7.3 shell 程序和语句
8.8 说明性语句和功能性语句
8.8.1 说明性语句(注释行)
8.8.2 常用的功能性语句
8.9 结构性语句
8.9.1 条件语句 if
8.9.2 测试语句 test
8.9.3 多路分支语句 case…esac
8.9.4 循环语句 for…do…done
8.9.5 循环语句 while…do…done
8.9.6 循环控制语句 break 和 continue
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 层循环语句的下一轮循环上。