分支结构: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"