Shell算数计算、函数
Shell数值运算
1、整数计算的方法
注: (())用于数值计算最高效
(1)expr命令:手工的命令行计数器
格式: expr 表达式
表达式说明:* 用空格隔开每项
* 用 \ 转义特殊的字符
* 包括空格或其他特殊字符的字符串需要用引号引起来
案列:
a、计算字串长度
# expr length "this is a test"
b、整数计算
# expr 14 + 9
# expr 14 % 5
# expr 14 - 5
# expr 14 \* 5 (注:使用乘号需要转义)
c、获取字串在主串中的位置
# expr index "this is a test" h
(2)bc命令:UNNIX下的运算器(可以计算整数也可以是小数)
用法:
a、# i=2
# i=`$i+1|bc`
# echo $i
b、# echo 3.5*5|bc
c、# echo "i=3;3.5*5|bc" #计算3.5*5并保留3位小数
d、通过一条命令计算1+2....+10的值(使用bc)
[root@localhost ~]# echo {1..10}|tr " " "+"|bc 使用tr把{}生成的序列中的空格转换成+
55
(3)(()):Linux下大量数据计算时最后高效的方法(只可处理整数)
用法:echo $((5*5))
(4) typeset命令:也可以用来设置变量属性
用法:
# typeset -i A=1 B=3
# A=A+B
# echo $A
(5)$[]
用法:
# i=1
# echo $[i+1]
(6)awk命令
Shell变量输入
1、read命令:从标准输入获得,read为bash内置变量
选项:
-p :设置提示信息
-t :设置等待时间,默认单位是秒(timeout)
练习:
(1)read 读入
[root@localhost ~]# read -p "pls input a number:" num
pls input a number:15
[root@localhost ~]# echo $num
15
(2) 设置等待时间
# read -t 10 -p "pls input a number" num #10s超时退出
(3)脚本
#!/bin/bash
read -p "pls input two number" num1 num2
a=$num1
b=$num2
echo "$a-$b=$(($a - $b))"
(4)脚本改进
#/bin/bash
read -p "pls input two int:" num1 num2
a=$num1
b=$num2
[ -z "$a" ]&&{
echo "first num must be int"
exit 1
}
[ -z "$b" ]&&{
echo "second num must be int"
exit 2
}
expr $a + $b
expr $a - $b
条件测试与比较
1、三种语法形式
语法格式1、test <测试表达式>
用法:
a、判断文件是否存在
test -f filename && echo 1 || echo 0
b、判断是否是目录
test -d /dir && echo 1 || echo 0
语法格式2、[<测试表达式>] 建议使用(系统写法)
注:内部不可用&&、||,用-a、-o代替
用法:
a、[ -f filename ] && echo 1 || echo 0
语法格式3、[[测试表达式]],内部可以使用&&、||
用法:
a、[[ -f filename && -d /dir ]] && echo 1 || echo 0
注:在[[]]中可以使用通配符进行模式匹配,但不能在[]中
Shell函数
1、函数有类似别名的功能,把程序中多次调用的代码定义成一份,之后再用这段代码只用函数名就行
使用函数的优势:
a、把相同的程序段定义成函数,可以减少整个程序的代码量
b、可以让程序代码更加清晰
c、增加程序的可读、易读性,以及可管理性
d、可以实现程序功能模块化,不同的程序使用函数模块化
**强调:**对于shell来说,Linux系统的2000个命令都可以说是shell的函数
2、shell函数语法:
规范语法格式:
function 函数名(){
指令。。。。
return n
}
提示:shell的返回值时exit输出返回值,函数里用return输出返回值
注意:函数传参方式 函数名 参数1 参数2 eg: fun 123 456
3、shell函数的执行
函数必须定义在调用他的函数前面
(1)直接执行函数名即可(不带小括号)
# 函数名
(2) 带参数的函数执行方法
# 函数名 参数1 参数2
提示:函数传参和脚本传参一样,只是脚本名替换成函数名即可。
特殊地:$0 比较特殊,它仍然是父脚本的名称
函数的参数变量是在函数提里面定义,如果是普通变量一般会使用local i 定义;
4、shell函数案例:
#!/bin/bash
function test(){
echo "hanmenghao"
}
test #函数调用
注:函数也可以定义在/etc/init.d/functions文件内,此时若在别的文件内调用此函数,需引入: 首行加 sh /etc/init.d/functions
5、shell函数传参 格式: 函数名 参数值
#!/bin/bash
function test()
{
echo "this is $1"
}
test hanmenghao
执行结果:
[root@localhost ~]# source hanshu.sh
hanmenghao
6、案列:函数传参转成脚本命令行传参,对任意指定的URL判断是否异常
分布解答:
a、脚本传参检查Web url是否正常(curl或wget检查)
b、检查的功能写成函数
c、函数传参转成脚本命令行传参,对任意指定Url判断是否异常
#!/bin/bash
[ -f /etc/init.d/functions ]&& . /etc/init.d/functions#好习惯,进去先加载系统函数库
usage(){
echo "USAGE : $0 url"
exit 1
}
CheckUrl(){ # -T 超时时间 --spider 爬虫 -t尝试次数
wget -T 10 --spider -t $1 2&>/dev/null
RETVAL=$?
if [ $RETVAL -eq 0 ];then
action "$1 URl" /bin/true
else
action "$1 URl" /bin/false
fi
return $REVAL
}
main(){ #main函数:主函数
if [ $# -ne 1 ];then
usage
fi
CheckUrl $1
}
main $* # $*:代表所有参数 "$*":把所有输入当作一项处理
7、案列:传两个参数实现给任意字符串按任意颜色输出
#!/bin/bash
RED_COLOR='\E[1:31m'
GREEN_COLOR='\E[1:32m'
YELLOW_COLOR='\E[1:33m'
BULE_COLOR='\E[1:34m'
PINK_COLOR='\E[1:35m'
RES='\E[0m' #RES代表执行此项颜色匹配
[ -f /etc/init.d/fountions ]&& . /etc/init.d/fountions
usage(){
echo "USAGE:$0 {red|green|blue\yellow}"
exit 1
}
color(){
case $1 in
red)
echo -e "$RED_COLOR $2 $RES"
;;
bule)
echo -e "$BULE_COLOR $2 $RES"
;;
yellow)
echo -e "$YELLOW_COLOR $2 $RES"
;;
green)
echo -e "$GREEN_COLOR $2 $RES"
;;
*)
usage
esac
}
main(){
if [ $# -ne 2 ];then
usage
fi
color $1 $2
}
main $*