一、多路分支语句 case语句
1、格式
case 表达式 in
模式1)
....语句列表
;;
模式2)
....语句列表
;;
模式3)
....语句列表
;;
*) //其他情况
....语句列表
;;
esac
2、总结
1)表达式 可以是 一个数字 、变量、字符串
2)case语句真正的功能强大之处不在于 使用固定的字符串,还可以使用模式进行匹配。
一个模式 是由 一串正规字符 和 特殊的通配符组成的字符串, 该模式可以用正则表达式。
3、例子
例子1:
#!/bin/bash
read -p "input data:" val
case $val in
1)
echo "1"
;;
2)
echo "2"
;;
3)
echo "3"
;;
*)
echo "other"
;;
esac
例子2:
#!/bin/bash
read -p "input data:" str
case $str in
h*) ---》只要是以h开头的字符串都会被匹配到
echo "h........."
;;
w*)---》只要是以w开头的字符串都会被匹配到
echo "w........."
;;
[0-9]*) ---》只要是以0到9数字开头的字符串都会被匹配到
echo "this is 0-9"
;;
esac
练习1:假设有一个文件1.txt,内容为10,要求写一个脚本,判断文件的内容
如果文件内容是 10 则 打印 big
如果文件内容是 5 则 打印 mid
如果文件内容是其他值,则打印 other
#!/bin/bash
#如果传递进来的参数个数 不等于1的时候
if [ $# -ne 1 ];then
echo "input arg<1"
exit
fi
if test -s $1;then
fileData=`cat $1`
case $fileData in
10)
echo "big"
;;
5)
echo "mid"
;;
*)
echo "other"
;;
esac
else
echo "file not exist"
fi
执行的时候,./test.sh 1.txt
二、循环语句
1、for
1)第一种格式:
for 变量名 in 单词表
do
done
2)例子:
例子1:
#!/bin/bash
for val in 1 2 3 4 5
do
echo -n "$val"
done
for循环中,每次挨个从单词表当中获取一个数据,赋值给变量val
例子2:
#!/bin/bash
for val in $*
do
echo "$val"
done
执行的时候
gec@ubuntu:~/shelltest$ ./05for.sh 10 20 30 40 50
10
20
30
40
50
解析:从命令行中传递了 5个字符串到脚本中,脚本里面使用了位置变量$*可以获取到所有传递进来的字符串。
3)第二种格式(类似C语言的方式)
for((i=0; i<5; i++))
do
echo "$i"
done
//双圆括号(())可以使得shell程序 用C语言的for风格写法
4)例子:
#!/bin/bash
for((i=0; i<5; i++))
do
echo "$i"
done
2、while
1)格式
while 命令或者表达式
do
语句
done
==》也可以使用C语言的while风格
while((1))
do
语句
done
例子: 从键盘上获取一个最小值 和 最大值, 打印他们两个之间的所有取值
min = 5
max = 10
C语言的写法:
while(min<max)
{
printf("%d ",min);
min++;
}
shell---》
shell的写法:
#!/bin/bash
read -p "min data:" min
read -p "max data:" max
#while test $min -le $max
#while [ $min -le $max ]
while((min<=max))
do
echo -n "$min"
min=`expr $min + 1`
done
练习2:写一个shell脚本, 分别使用 for 和 while 算出 1+2+。。。。+100的和
C--->
int i;
int sum=0;
for(i=1; i<=100; i++)
{
sum+=i;
}
shell-->
#!/bin/bash
#for
sum=0
for((i=0; i<=100; i++))
do
sum=`expr $sum + $i`
done
echo "sum:$sum"
C---->while
int i=1,sum=0;
while(i<=100)
{
sum+=i;
i++;
}
shell--->while
i=1
sum=0
while((i<=100))
do
sum=`expr $sum + $i`
i=`expr $i + 1`
done
echo "sum:$sum"
注意: break 和continue 跟C语言 的用法 差不多
练习3: 写一个脚本,可以实现不断地从键盘中获取数据
如果获取的数据为"exit",则退出
如果获取的数据小于100,则打印这个值
如果获取的数据是其他的,则打印 other
第一种写法:
#!/bin/bashwhile((1))
do
read -p "input data:" strif test $str = "exit" ;then
break
elif test $str -lt 100;then
echo "$str"
else
echo "other"
fi
done
第二种写法:
while((1))
do
read -p "input data:" str
case $str in
exit)
exit
;;
[0-9][0-9])
echo "$str"
;;
[0-9])
echo "$str"
;;
*)
echo "other"
;;
esac
done
三、函数
1、格式
函数名字()
{
命令列表
return 返回值
}
比如:
func()
{
echo "func"
return 12
}
2、注意
1)函数在定义的时候 ()不写参数
2)返回值的大小不超过 1个字节
3)shell中没有变量作用域,如果出现重复变量名会认为是同一个。
3、调用
函数名 参数1 参数2 参数3
比如:
func -->这个就是调用,没有进行传参
func 10 20 30
在函数内部 10----》$1 20-->$2 30-->$3
4、获取函数的返回值
func 10 20 30
ret=$? -->这个就是获取函数的返回值,存储到变量ret中
echo "ret:$ret"
5、例子
#!/bin/bash
func()
{
echo "func"
echo "$1"
echo "$2"
echo "$3"
return 11
}
func 10 20 30ret=$?
echo "ret:$ret"
练习4:编写一个脚本,封装一个函数从键盘上输入两个数,实现比较两个数的最大值,并且打印出来
#!/bin/bash
compare()
{
if test $1 -ge $2;then
max=$1
else
max=$2
fi
}
read -p "input data:" val1 val2
compare $val1 $val2
echo "max:$max"
练习5:编写一个脚本,实现一个函数从键盘上输入两个数a和b,求 a+....+b的和
a=10 b=20 --> 10+11+12...+20的和
#!/bin/bash
sum=0
get_sum()
{
for((i=$1; i<=$2; i++))
do
sum=`expr $sum + $i`
done
}
read -p "input data:" val1 val2
get_sum $val1 $val2
echo "sum:$sum"
四、正则表达式
字符串是计算机应用中最广泛的处理对象之一(网页、文档),并且字符串组合规则形式多样,比如
数字字符串 123456
C语言标识符 “hello”
IP地址字符串 192.168.11.44
。。。。
上面这些都是我们程序设计需要处理的对象,现在的问题是:计算机要处理这些字符串,首先需要某种语言去描述符这些字符串的规则
===>正则表达式,它就是描述某一个特定规则的表达式
[ 0-9]+ --->数字
正则表达式 的字符组成
正则表达式是由一些字符去描述规则,在正则表达式中有两类字符
1、元字符:不代表自己,代表某个特定的字符 或者多个字符
2、普通字符:仅代表自身的字符 \元字符 -->普通字符
正则表达式 有不同的流派(java c# py ),不同的语言都用到了正则表达式,但是这些语言用来描述字符串规则 不是都一样,我们称为 正则表达式有不同的流派。
元字符: 不代表自己,代表某个特定的字符 或者多个字符
. 匹配任意单个字符,英文字母、数字。。。。。本身
[] 字符组。 从 [] 内任选 一个字符 ,比如 [0-9]代表任意一个数字字符 [a-h]
[^] 字符组。 从[] 外任选一个字符 ,比如 [^0-9] 代表任意一个非数字字符
\d 代表一个数字字符 \d ==> [0-9]
\D 代表一个非数字字符 \D ==> [^0-9]
\w 匹配字母、数字、下划线 ==> [a-zA-Z0-9_]
\W 匹配非字母、数字、下划线 ==> [^a-zA-Z0-9_]
\s 匹配空白字符 [\n\t\r]
\S 匹配非空白字符 [\n\t\r]
\b 匹配单词边界
"hello world 123"--->现在用一个表达式匹配world \bworld\b
* 匹配0个或者多个 先前字符(先前模式), 比如:.* 匹配任意字符串
比如 aa aaa bbb cccc aaaaa ---a*
? 匹配0个或者1个先前字符 (先前模式) 比如 a aa aaa aaaa
+ 匹配 一个或者多个先前字符 (先前模式) "a+ "{数字} 匹配固定数目的先前字符 比如 a{3}
[0-9]{1,2} ----> sdsdssdasd1244adsds234adfsd454ads4564sfdfsdfr56sadf
{最小数目,最大数目} a{1,3}
{最小数目,} 从最小值开始匹配 "a{3,}"
() 作为一个整体,子模式 如 (abc){2,3}
"[a]"
aaaa bbbcccc aaa adbasd
aa bbbaa
所谓的匹配指的是 通过 正则表达式 找到 符合条件的字符串
正则表达式 ----》处理字符串 "a*"
正则表达式 在线测试工具 :https://c.runoob.com/front-end/854/
练习8: 用正则表达式 配出 5块钱以下的钥匙 2yaoshi 4yaoshi
adsdad3yaossdsdsdfdadsd6yaoshi asdsdsds2yaoshiasdsd
答案:[0-4]yaoshi