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目录下,并计算文件的个数。