Bootstrap

Linux/C高级(精讲)----shell结构语句、shell数组

shell脚本

功能性语句

test

可测试对象三种:字符串 整数 文件属性

每种测试对象都有若干测试操作符

1)字符串的测试:

s1 = s2 测试两个字符串的内容是否完全一样

s1 != s2 测试两个字符串的内容是否有差异

-z s1 测试s1 字符串的长度是否为0

-n s1 测试s1 字符串的长度是否不为0

2)整数的测试:

a -eq b 测试a 与b 是否相等 equal

a -ne b 测试a 与b 是否不相等 not equal

a -gt b 测试a 是否大于b greater than

a -ge b 测试a 是否大于等于b greater equal

a -lt b 测试a 是否小于b litter than

a -le b 测试a 是否小于等于b litter equal

3)文件属性的测试:

-d name 测试name 是否为一个目录

-f name 测试name 是否为普通文件

-e name 测试文件是否存在

#!/bin/bash
#A=5
#A=`expr $A + 1`
#((A++))
# read -p "input:" a b c d
# SUM=`expr $a \* $b + $c - $d / $b`
# ((S=a*b+c-d/b))
# echo $SUM
# echo $S

#测试两个字符串的内容是否完全一样
VAR="nihao"
test $VAR = "hello"
echo $?

#测试两个字符串的内容是否有差异
VAR="nihao"
test $VAR != "hello"
echo $?

#测试字符串的长度是否为0
test -z $VAR
echo $?

#测试字符串的长度是否不为0
test -n $VAR
echo $?
#测试两个数是否相等
test 10 -eq 20
echo $?
#测试两个数是否不相等
test 10 -ne 20
echo $?
#测试a是否 > b
test 10 -gt 20
echo $?
#测试a是否 >= b
test 10 -ge 20
echo $?
#测试a是否 < b
test 10 -lt 20
echo $?
#测试a是否 <= b
test 10 -le 20 
echo $?

read -p "input:" F
#测试是否为一个目录
test -d $F
echo $?
#测试是否为普通文件
test -f $F
echo $?
#测试文件是否存在
test -e $F
echo $?

结构性语句

if语句

基本结构:

if 条件

then

命令表1

else

命令表2

fi

多路分支语句:

if 条件1

then

命令表1

elif 条件2

then

命令表2

fi

嵌套结构:

if 条件1

then

if 条件2

then

命令表1

fi

else

命令表2

fi

补充操作符:

-o 或运算 例如 [ $a -lt 20 -o $b -gt 100 ] 返回 true

-a 与运算 例如 [ $a -lt 20 -a $b -gt 100 ] 返回 false

! 非运算 例如 [ ! false ] 返回 true

&& 逻辑与 例如 [[ $a -lt 100 && $b -gt 100 ]] 返回 false

|| 逻辑或 例如 [[ $a -lt 100 || $b -gt 100 ]] 返回 true

| 位或 例如 echo $[2|2]

&位与 例如 echo $[2&1]

case语句

格式:

case 变量 in

模式1)

命令表1

;;

模式2)

命令表2

;;

*)

命令表n

;;

esac

练习:学生成绩管理系统,用shell中的case实现

90-100:A

80-89:B

70-79:C

60-69:D

<60:不及格

for循环

格式:

for 变量名 in 单词表

do

命令表

done

变量依次取单词表中的各个单词, 每取一次单词, 就执行一次循环体中的命令。循环次数由单词表中的单词数确定。命令表中的命令可以是一条, 也可以是由分号或换行符分开的多条。

for语句的几种书写格式:

1)for i in 1 2 3 4 do....done :

变量i从单词表中取值

2)for i do...done:

变量i从命令行取值,可以省略in单词表

3)for i in {1..10} do...done:

变量i从1-10个数中取值

4)for ((i = 0; i < 10; i++)) do...done:

书写格式类似c语言

while:

格式:

while 命令或表达式

do

命令表

done

while语句首先测试其后的命令或表达式的值,如果为真,就执行一次循环体中的命令,然后再测试该命令或表达式的值,执行循环体,直到该命令或表达式为假时退出循环。

练习:

分别用for和while实现1-10求和

循环控制语句

break n :结束n层循环

continue n: 结束n层的本次循环,继续下一次循环

数组

数组的赋值:

(1) arr=(1 2 3 4 5)

(2) arr=($1 $2 $3...)

(3) readabc

arr=($a $b $c)

(4) read -a arr

数组的调用:

${arr[i]} #引用数组元素,数组元素下标从0开始到n-1结束

arr[i]=10 #对数组元素重新赋值

${arr[@]} #遍历数组

${#arr[@]} #数组元素的个数

练习:

从终端输入3个整数,输出三个数中的最小值

冒泡排序:

选择排序:

函数

函数的定义方式

(1) 函数名()

{

命令表

}

(2) function 函数名()

{

命令表

}

函数的调用

函数名 参数列表

函数内 $1 $2 表示的是传递给函数的参数

作业:

用shell脚本试下以下功能:

判断当前路径下是否存在目录aa,如果不存在创建;遍历当前路径下的文件,如果是普通文件,将文件复制到aa目录下,并计算文件的个数。

;