LinuxC高级
shell中的语句
功能性语句
- test
test 语句可以测试三种对象:
字符串 整数 文件属性
每种测试对象都有若干测试操作符
3.1. 字符串测试
s1 = s2 测试两个字符串的内容是否完全一样
test "hello" = "world"
echo $? # 1 相等为真,不想等为假
s1 != s2 测试两个字符串的内容是否有差异
test "hello" != "world"
echo $? # 0 相等为假,不相等为真
-z s1 测试字符串的长度为0
test -z ""
echo $? # 0 字符串没有长度,则为真
test -z "hello"
echo $? # 1 字符串有长度,则为假
-n s1 测试字符串的长度不为0
test -n ""
echo $? # 1 字符串没有长度,则为假
test -n "hello"
echo $? # 0 字符串有长度,则为真
3.2. 整数的测试:
a -eq b 测试a和b是否相等 equal
read A B
test $A -eq $B
echo $? # 如果两个数相等则为真,反之为假
a -ne b 测试a和b是否不相等 not equal
read A B
test $A -ne $B
echo $? # 如果两个数不相等则为真,反之为假
a -gt b 测试a是否大于b greater than
read A B
test $A -gt $B
echo $? # 如果a大于b则为真,反之为假
a -ge b 测试a是否大于等于b greater equal than
read A B
test $A -ge $B
echo $? # 如果a大于等于b则为真,反之为假
a -lt b 测试a是否小于b less than
read A B
test $A -lt $B
echo $? # 如果a小于b则为真,反之为假
a -le b 测试a是否小于等于b less equal than
read A B
test $A -le $B
echo $? # 如果a小于等于b则为真,反之为假
3.3. 文件属性
-d name 测试name是否为一个目录
read FILE
test -d $FILE
echo $? # 如果name是目录则为真,反之为假
-f name 测试name是否为一个普通文件
read FILE
test -f $FILE
echo $? # 如果name是普通文件则为真,反之为假
-e name 测试name是否存在
read FILE
test -e $FILE
echo $? # 如果文件或目录存在则为真,反之为假
补充:
FILE1 -nt FILE2:1的时间戳比2的更新
FILE1 -ot FILE2:1的时间戳比2的更旧
-b FILE:文件存在且是一个块设备文件
-c FILE:文件存在且是一个字符设备文件
-d FILE:文件存在且是一个目录设备文件
-f FILE:文件存在且是一个普通文件
-e FILE:文件存在
-h 或者 -L FILE:文件存在且为软链接文件
-s FILE:文件存在且大小不为0
-S FILE:文件存在且是一个套接字文件
-p FILE:文件存在且是一个管道文件
-w FILE:文件存在且有可写权限
-r FILE:文件存在且有可读权限
-x FILE:文件存在且有可执行权限
结构性语句
if .. then .. fi
- 基本结构
if 表达式
then
命令表
fi
- 分层结构
if 表达式
then
命令表1
else
命令表2
fi
- 嵌套结构
if 表达式
then
if 表达式
then
命令表
fi
else
命令表
fi
可以使用 [] 将test省略,[]本质上是一个test命令
- elif
if 表达式1
then
命令表1
elif 表达式2
then
命令表2
...
else
命令表n
fi
case语句
case 变量 in
模式1)
命令表1
;;
模式2)
命令表2
;;
...
*)
命令表n
;;
esac
工作方式:
取值后面必须为关键字 in ,每一个模式必须以右括号结束。
取值可以为变量或者常量,取值检测匹配的每一个模式
一旦模式匹配,其间所有命令开始执行直至 ;;
执行完匹配模式相应的命令不会再继续匹配其他的模式
如果无一匹配模式,使用 * 号捕获该值
练习:学生成绩管理系统,用shell中的case实现
90-100:A
80-89:B
70-79:C
60-69:D
<60:不及格
for循环
for 变量名 in 单词表
do
命令表
done
执行顺序:
变量依次取单词表中的各个单词, 每取一次单词, 就执行一次循环体中的命令. 循环次数由单词表中的单词数确定. 命令表中的命令可以是一条, 也可以是由分号或换行符分开的多条。
示例:
#!/bin/bash
for I in 1 2 3 4 5
do
echo $I
done
for语句的几种书写格式
- for i in 1 2 3 4 do ... done
变量i从单词表中取值
- for i do ... done
变量i从命令行取值,可以省略in单词表
- for in {1..10} do ... done
变量i从1-10中依次取值
- for (( i = 0; i < 10; i++ )) do .. done
书写格式类似于C语言
可以取到当前目录下所有的文件或者目录
练习:
1、终端输入行数,打印直角三角形
*
**
***
·····
while循环
while 命令或表达式
do
命令表
done
执行顺序:
while语句首先测试其后的命令或表达式的值,如果为真,就执行一次循环体中的命令,然后再测试该命令或表达式的值,执行循环体,直到该命令或表达式为假时退出循环。
循环控制语句
break n :结束n层循环
continue n :跳过n层的本次循环
#!/bin/bash
for (( i = 1; i <= 5; i++ ))
do
for (( j = 1; j <= 5; j++ ))
do
if [ $j -eq 3 ]
then
# break 1
# break 2
# continue 1
continue 2
fi
echo "$i:$j"
done
done