shell学习十--expr及expr和let性能比较

来源:互联网 发布:win7重装网络协议 编辑:程序博客网 时间:2024/05/29 18:09
expr
expr命令一般用于整数值,但也可用于字符串。
格式 :expr arg
一、计算
例子1:
[root@node01 day4]# expr 2 + 2
4
[root@node01 day4]# expr 2 + 1
3
[root@node01 day4]# expr 2 - 1
1
[root@node01 day4]# expr 2 -1    两边都必须要有空格
expr: syntax error
[root@node01 day4]# expr 2-2     两边都要空格
2-2
[root@node01 day4]# expr 2 -  1
1
[root@node01 day4]# expr 2-  1   两边都要空格
expr: syntax error

[root@node01 day4]# expr 2 \*1
expr: syntax error
[root@node01 day4]# expr 2 \* 1   两边都要空格
2
[root@node01 day4]# expr 2 % 2
0
[root@node01 day4]# expr 2 % 1
0
[root@node01 day4]# expr 2 % 3
2
[root@node01 day4]# expr 2 %3  两边都要空格
expr: syntax error
提示:expr用法
1、注意:运算符及计算的数字左右两边都有至少一个空格
2、使用乘号(*)时,必须用反斜线屏蔽其特定含义,因为shell可能会误解星号的含义

增量计数
expr在循环中可用于增量计算,首先,循环初始化为0,然后循环值增加1,反引号的用法为命令
替代最基本的一种是从(expr)命令接受输出并将之放入循环变量。
例子2:
[root@node01 day4]# i=0
[root@node01 day4]# i=`expr $i + 1`
[root@node01 day4]# echo $i
1
[root@node01 day4]# b=`expr $i + 1` 
[root@node01 day4]# echo $b
2

例子3:
[root@node01 day4]# expr $[2+3]
5
[root@node01 day4]# expr $[2 +3]
5
[root@node01 day4]# expr $[2 + 3]
5
[root@node01 day4]# echo $[2+3]
5

二、expr的特殊用法
判断一个文件的扩展名
[root@node01 day4]# vi `which ssh-copy-id`
#!/bin/sh
# Shell script to install your public key on a remote machine
# Takes the remote machine name as an argument.
# Obviously, the remote machine must accept password authentication,
# or one of the other keys in your ssh-agent, for this to work.

ID_FILE="${HOME}/.ssh/id_rsa.pub"

if [ "-i" = "$1" ]; then
  shift
  # check if we have 2 parameters left, if so the first is the new ID file
  if [ -n "$2" ]; then
    if expr "$1" : ".*\.pub" > /dev/null ; then   判断扩展名是pub
      ID_FILE="$1"
    else
      ID_FILE="$1.pub"
    fi

例子4
[root@node01 day4]# expr "test.pub " : ".*\.pub" && echo 1||echo 0 
8
1
[root@node01 day4]# expr "test.pu " : ".*\.pub" && echo 1||echo 0  
0
0
[root@node01 day4]# expr "test.pu " : ".*\.pub" >/dev/null && echo 1||echo 0  
0
[root@node01 day4]# expr "test.pu " : ".*\.pub" &>/dev/null && echo 1||echo 0 
0

例子5:
[root@node01 day4]# vi expr.sh     
#!/bin/bash
   if expr "$1" : ".*\.pub" &>/dev/null; then
      echo "ok $1"
else
      echo "pls use *.pub file"
fi                              
[root@node01 day4]# sh expr.sh a.sh
pls use *.pub file
[root@node01 day4]# sh expr.sh a.pub
ok a.pub

expr  整数判断
[root@node01 day4]# vi expr1.sh
#!/bin/bash
expr 1 + $1 &>/dev/null
if [ $? -eq 0 ]
   then
      echo "zhengshu"
else
      echo "no zhengshu"
fi
[root@node01 day4]# sh expr1.sh 1.1
no zhengshu
[root@node01 day4]# sh expr1.sh 1
zhengshu

始终循环判断
[root@node01 day4]# vi expr2.sh 
#!/bin/bash
while true
do
   read -p "Pls input:" a
   expr $a + 0 >/dev/null 2>&1
   [ $? -eq 0 ] &&echo int||echo chars
done
[root@node01 day4]# sh expr2.sh 
Pls input:1
int
Pls input:3
int
Pls input:^[[A
chars
Pls input:
===============================================
expr "text.sh" : ".*\.sh" &>/dev/null && echo "yes" ||echo  "no"
expr 1 + $1 &>/dev/null&& echo 'yes' || echo 'no'  注意1 + $1和加号之间的空格 可以判断$1 是不是整数


三、expr计算字符串长度
提取指定字符的下标:expr index 内容 字符,例如:$ind=`expr index "$content" "="` 
提取字符串的子串:expr substr 内容 起始位置 终点位置,例如:$con=`expr substr "$content" "1" $ind 

1、、计算字串长度
[root@node01 day4]# expr length "bkeep zbb"
9
2、抓取字串 
[root@node01 day4]# expr substr "bkeep zbb" 4 9 
ep zbb
3、抓取第一个字符数字串出现的位置 
[root@node01 day4]# expr index "bkeep zbb" e 
3

四、let和expr性能比较
[root@node01 day4]# vi exprtime.sh
#!/bin/bash
i=0
while [ $i -lt 100000 ]
do
      i=` expr $i + 1 `
      echo $i >>/dev/null 2>&1
done
[root@node01 day4]# time sh exprtime.sh 


real    0m54.855s
user    0m4.319s
sys     0m7.641s


[root@node01 day4]# vi lettime.sh       
#/bin/bash
i=0
while [ $i -lt 100000 ]
do
    let "i = $i + 1"
    echo $i >>/dev/null 2>&1
done
[root@node01 day4]# time sh lettime.sh 


real    0m2.072s
user    0m1.752s
sys     0m0.320s      


通过上面两个例子,不言而喻,很明显 let以超高的优势获胜,let快expr 几十倍!
原创粉丝点击