|
1.变量的处理计算变量长度与其他不同方法的耗时对比
[iyunv@server2 ~]# chars=`seq -s "" 100`2015-1-22
[iyunv@server2 ~]# echo ${#chars}
291
[iyunv@server2 ~]# echo $(expr length "$chars")
291
[iyunv@server2 ~]# echo ${chars} | wc -m
292
[iyunv@server2 ~]# time for i in $(seq 11111);do count=${#chars};done;
real 0m2.446s
user 0m2.415s
sys
0m0.028s
[iyunv@server2 ~]# time for i in $(seq 11111);do count=${chars} | wc -m ;done;
real 1m0.134s
user 0m13.734s
sys
0m23.029s
[iyunv@server2 ~]# time for i in $(seq 11111);do count=`echo expr length "${chars}"`;done;
real 0m18.653s
user 0m7.708s
sys
0m8.562s
我们看到速度相差几十到上百倍,一般情况调用外部命令处理,与内置功能操作性能相差较
大。在 shell 编程中我们应尽量使用内置操作或函数完成。
变量处理替换的一些参考资料
01)man bash 变量处理大全
02)http://www.cnblogs.com/chengmo/archive/2010/10/02/1841355.html
[iyunv@server2 ~]# man bash 进入后查找 word,我们一直往下翻就可以看到对字符的各种处
理
注:我们要想成为比较好的,我们就要看官方的一首资料,但是如果实在不行,我们可以去
网上搜集二手的资料,比如别人总结好的资料
2.变量的数值计算
变量的数值计算常见的有如下几种命令:
(())、let、expr、bc $[]
1) (())用法:(此法很常用,且效率高)
用于执行简单的整数运算,只需将特定的算术表达式用"$(("和"))"括起来
shell 的算术运算符号都置于"$(("..."))"的语法中。这一语法如同双引号功能,除了内嵌双引号
无需转义。
范例 1:shell 的算术运算实例如下:
[iyunv@server2 ~]# ((a=1+2**3-4%3))
[iyunv@server2 ~]# echo $a
8
[iyunv@server2 ~]# b=$((1+2**3-4%3))
//两个**为幂运算
[iyunv@server2 ~]# echo $b
8
[iyunv@server2 ~]# echo $((1+2**3-4%3))
8
[iyunv@server2 ~]# echo $((a+=1))
9
[iyunv@server2 ~]# echo $((a++))
9
[iyunv@server2 ~]# echo $a
10
[iyunv@server2 ~]# echo $((a--))
10
[iyunv@server2 ~]# echo $a
9
[iyunv@server2 ~]# echo $((--a))
8
[iyunv@server2 ~]# echo $((3>2))
1
[iyunv@server2 ~]# echo $((3 /dev/null ; then
ID_FILE="$1"
else
ID_FILE="$1.pub"
fi
shift
# and this should leave $1 as the target name
其中:expr "$1" : ".*\.pub" 匹配*.pub 格式的文件如果是则为真非零,如果为假则
输出 0
[iyunv@server2 ~]# expr "test.txt" : ".*\.pub"
0
[iyunv@server2 ~]# expr "test.pub" : ".*\.pub"
8
这里显示的是 test.pub 这个字符串的长度
判断文件或字符串的扩展名小案例:
[iyunv@server2 ~]# expr "test.txt" : ".*\.pub" && echo 1 || echo 0
0
0
[iyunv@server2 ~]# expr "test.pub" : ".*\.pub" && echo 1 || echo 0
8
1
通过 expr 判断变量是否为整数
[iyunv@server2 ~]# vim expr.sh
#!/bin/bash
while true
do
read -p "Pls input:" a
expr $a + 0 &>/dev/null
//expr $a + 0 >/dev/null 2>&1
[ $? -eq 0 ] && echo int || echo chars
done
[iyunv@server2 ~]# sh expr.sh
Pls input:a
chars
Pls input:8.21
chars
Pls input:2
Int
通过 expr 计算字符串的长度
[iyunv@server2 ~]# chars=`seq -s "" 100`
[iyunv@server2 ~]# echo ${#chars}
291
[iyunv@server2 ~]# echo $(expr length "$chars")
291
4)bc 命令的用法:
bc 是 UNIX 下的计算器,它也可以用在命令行下面:
例:
[iyunv@server2 ~]# i=2
[iyunv@server2 ~]# echo $i+1
2+1
[iyunv@server2 ~]# echo $i+1 | bc
3
//可以计算,但是效率比较低
*因为 bc 支持科学计算,所以这种方法功能非常强大
[iyunv@server2 ~]# echo 3.5+5 |bc
8.5
[iyunv@server2 ~]# echo 3.5+5.6 |bc
9.1
[iyunv@server2 ~]# echo 3.5-3.1 |bc
.4
通过计算表达式计算
[iyunv@server2 ~]# seq -s "+" 10
1+2+3+4+5+6+7+8+9+10
[iyunv@server2 ~]# seq -s "+" 10 |bc
55
[iyunv@server2 ~]# echo "scale=2;5.23 / 3.13" |bc
//这样表示保留两位小数
1.67
[iyunv@server2 ~]# echo "obase=2;8"|bc
//这样表示进制转换
1000
[iyunv@server2 ~]# echo "obase=16;32" |bc
20
特点:bc 的特点是支持小数运算
5)typeset 命令的用法:
[iyunv@server2 ~]# typeset -i A=1 B=3
[iyunv@server2 ~]# A=A+B
//效率高
[iyunv@server2 ~]# echo $A
4
6)$[]的用法:
[iyunv@server2 ~]# echo $[2+3]
5
[iyunv@server2 ~]# echo $[ 2 + 3 ]
5
[iyunv@server2 ~]# echo $[2-3]
-1
[iyunv@server2 ~]# echo $[2*3]
6
[iyunv@server2 ~]# echo $[2/3]
0
[iyunv@server2 ~]# echo $[2%3]
2
实际解决问题例子:打印数学杨辉三角(第一种为重点)
http://oldboy.blog.iyunv.com/2561410/756234
#!/bin/bash
if(test -z $1);then
======================================================================
3.shell 变量的输入
Shell 变量除了可以直接赋值或脚本传参外,还可以使用 read 命令从标准输入获得
『语法格式』
read 『参数』『变量名』
『常用参数』
-p prompt:设置提示信息
-t timeout:设置输入等待的时间,单位默认为秒。
范例 1:read 的基本读入
[iyunv@server2 ~]# read -p "please input a number:" a //指定提示符
please input a number:3
[iyunv@server2 ~]# read -t 3 -p "please input a number:" a //指定自动退出时间
please input a number:[iyunv@server2 ~]#
[iyunv@server2 ~]# read -t 5 -p "please input a number:" a b
//可连续接收多个值
please input a number:33 44
[iyunv@server2 ~]# echo $a $b
33 44
提示:上面 read -p 的功能可以用 echo 和 read 实现
echo -n “please input two number:”
read a1 a2
以上两句和下面的命令相当(-t 排除在外)
例:实现简单的计算器功能
read.sh
#!/bin/bash
#read -p "please input two numbers:" a b
echo -n "please input two numbers:"
read a b
echo "a+b = $(( $a + $b ))"
echo "a-b = $(( $a - $b ))"
echo "a*b = $(( $a * $b ))"
echo "a/b = $(( $a / $b ))"
echo "a**b = $(( $a ** $b ))"
echo "a%b = $(( $a %$b ))"
如何用循环判断输入的数不是整数,并且重新输入:
方法一:
#!/bin/bash
$a
$b
function_input(){
read -p "Pls input:" c
for i in $(seq 10)
do
expr $c + 0 &>/dev/null
[ $? -eq 0 ] && break || read -p "please reinput:" c
done
}
function_input;
a=$c
function_input;
b=$c
echo "a+b = $(( $a + $b ))"
echo "a-b = $(( $a - $b ))"
echo "a*b = $(( $a * $b ))"
echo "a/b = $(( $a / $b ))"
echo "a**b = $(( $a ** $b ))"
echo "a%b = $(( $a %$b ))"
方法二:
#!/bin/bash
$a
$b
function_input(){
read -p "Pls input:" c
while true
do
expr $c + 0 &>/dev/null
[ $? -eq 0 ] && break || read -p "please reinput:" c
done
}
function_input;
a=$c
function_input;
b=$c
echo "a+b = $(( $a + $b ))"
echo "a-b = $(( $a - $b ))"
echo "a*b = $(( $a * $b ))"
echo "a/b = $(( $a / $b ))"
echo "a**b = $(( $a ** $b ))"
echo "a%b = $(( $a %$b ))"
======================================================================
4.条件测试
1)测试语句
1.1)条件测试语法
在 bash 的各种流程控制结构中通常要进行各种测试,然后根据测试结果执行不同
的操作,有时也会通过与 if 等条件语句相结合,让我们可以方便的完成判断。
生活中的例子:我要去图书馆,问一下
『语法说明』
格式 1:test
格式 2:[]
格式 3:[[]]
说明:
格式 1 和格式 2 是等价的。
格式 3 为扩展的 test 命令,有网友推荐用格式 3,老男孩习惯用格式 2.
提示:
在[[]]中可以使用通配符。&&、||、>、&/dev/null
多分支举例:
a=$1
b=$2
if [ $# -ne 2 ]
then
echo "Usage:sh $0 num1 num2"
exit 1
fi
if [ $a -gt $b ]
then
echo "yes,$a > $b"
elif [ $a -eq $b ]
then
echo "yes,$a = $b"
else
echo "yes,$a < $b"
fi
加入对数字的判断:
a=$1
b=$2
if [ $# -ne 2 ]
then
echo "Usage:sh $0 num1 num2"
exit 1
fi
[ -n "`echo $1 | sed 's/[0-9]//g'`" ] && echo "第 一 个 参 数 必 须 为 数 字 " &&
exit 1
[ -n "`echo $2 | sed 's/[0-9]//g'`" ] && echo "第 二 个 参 数 必 须 为 数 字 " &&
exit 1
if [ $a -gt $b ]
then
echo "yes,$a > $b"
elif [ $a -eq $b ]
then
echo "yes,$a = $b"
else
echo "yes,$a < $b"
fi
扩展:判断字符串是否为数字的多种方法
法一:sed 加正则表达式
命令行传参:
组合语法判断 1:
[ -n "`echo $num |sed 's/[0-9]//g'`" -a -n "`echo $2 | sed 's/[0-9]//g'`" ] && echo "两个参
数都必须为数字" && exit 1
组合语法判断 2:
[ -n "`echo $num |sed 's/[0-9]//g'`" -a -n "`echo $2 | sed 's/[0-9]//g'`" ] && {
echo "两个参 数都必须为数字"
exit 1
}
普通变量判断:
[ -n "`echo $num |sed 's/[0-9]//g'`" ] &&echo "第二个参数都必须为数字" && exit 1
条件表达式,大括号的用法
[ -n "`echo $num |sed 's/[0-9]//g'`" ] && {
echo "第二个参数都必须为数字"
exit 1
}
法二:变量的子串替换加正则表达式
[iyunv@server2 ~]# num=hy2015
[iyunv@server2 ~]# [ -z "`echo "${num//[0-9]/}"`" ] && echo 1 || echo 0
0
[iyunv@server2 ~]# num=2015hy2015
[iyunv@server2 ~]# [ -z "`echo "${num//[0-9]/}"`" ] && echo 1 || echo 0
0
法三:变量的子串替换加正则表达式(特殊判断思路)
思路:如果 num 长度不为 0,并且把 num 中的非数字部分删除,然后看结果是不
是等于 num 本身,如果两者都成立就是数字。
-n "num" #->如果 num 长度不为 0 表达式
"$num" = "${num//^[0-9]/}" #->把 num 中的非数字部分删除,然后看结果是不是等
于 num 本身,如果两者都成立就是数字。
[iyunv@server2 ~]# [ -n "$num" -a "$num" = "${num//[^0-9]/}" ] && echo "it is num"
测试:
[iyunv@server2 ~]# num=2015
[iyunv@server2 ~]# [ -n "$num" -a "$num" = "${num//[^0-9]/}" ] && echo "it is num"
it is num
法四:expr 计算判断
[iyunv@server2 ~]# num=2015
[iyunv@server2 ~]# expr $num + 0 >/dev/null 2>&1
[iyunv@server2 ~]# [ $? -eq 0 ] && echo int
int
邮箱:g2hy@qq.com
|
|
|