正文
分支结构:if语句
语法:
if command; then
...
语句列表
else #else也可以不要
...
fi #if结束
command可以是任意的可以执行的shell命令或者脚本
从键盘上输入两个整数,输出较大者。
read a b if [ $a -gt $b ] ; then echo $a else echo $b fi
从键盘上输入一个整数,判断这个整数是否为奇数。
read a if [ `expr $a % 2` -eq 1 ];then echo "这是一个奇数" else echo "这不是一个奇数" fi
多路分支语句 case语句
语法:
case 字符串变量 in
模式1)
...语句列表
;; #类似于c语言中的break,但是在shell里,;;一定要有的。
模式2)
...
;;
...
模式n)
;;
esac #case结尾反过来写
case语句真正的功能强大之处在于它可以使用模式,而不是固定的字符匹配
一个模式是一串正规的字符和特殊通配符组成的字符串。
//case模式可以用正则表达式(非常有限地支持)
特殊的通配符:
* shell通配符 代表任意多个或者0个字符(注,在正则表达式中,* 代表匹配0个或者多个先前字符)
? shell通配符 代表一个任意字符(注,在正则表达式中,? 代表匹配0个或者1个先前字符(模式))
shell中的 ;; 双引号相当于C语言中的break。
判断一个文件名,是C源文件还是c++源文件(.cpp)还是头文件:
case $1 in #获取第一个参数 *.c) echo "C文件" ;; *.cpp) echo "C++文件" ;; *.h) echo "头文件" ;; esac
循环语句
for语句
语法:
for 变量名 in 单词表
do
...
语句列表
done
"单词表":以空白符分隔开的字符串的列表
eq:
a b c ddd "a c" 几个单词? --》5个单词
for语句执行的次数就是“单词表”中的单词个数
并且吗,每次执行时,“变量名”的值 就是下一个单词的值。
for i in a b c ddd "a c" do echo $i done #输出 a b c ddd "a c"
用for语句求100以内的奇数之和
(())双圆括号使得可以在shell使用c语言的for风格
但是,只能在for这一行可以使用 ,其它行还是shell风格,如下代码:
for ((i=0;i<100;i++)) do if [ `expr $i % 2` -eq 1 ];then let n=n+i #n=`expr $n + $i` fi done echo $n
while语句
while 命令或者表达式
do
...
语句列表
done
练习:
写一个shell脚本计算一个普通文件有多少行。
提示:
输入重定向
read是一行一行的读
line=0 while read var do line=`expr $line + 1` done <test.txt echo "line = $line"
until 命令或者表达式
语法:
do
...语句列表
done
until和while功能类似,但是不同的是until只当测试的命令或者表达式为假时(不成功)才执行循环体内的命令列表,条件成立或成功,就退出循环,这一点和while是相反的。
输出1000以内的质数:
i=2 j=3 echo -n "1000以内的质数有:1 2 " while [ $j -le 1000 ] do until [ $i -eq $j ] do if [ `expr $j % $i` -eq 0 ];then { break } fi let i=i+1 done if [ $i -eq $j ];then echo -n "$j " fi let j=j+1 i=2 done
break 和continue
break n
跳出第n层循环
continue n
转到最近的第n层循环语句执行下一轮循环
数字n表示第几层循环
break n ,continue n n不写默认是1,和c语言含义是一样的。
获取参数
将命令行中的参数相加,如在终端输入 ./1.sh 5 3,则输出 8.
v=`expr $1 + $2` echo "$v"