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

xiaoxiao2021-02-27  159

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 几十倍!
转载请注明原文地址: https://www.6miu.com/read-15374.html

最新回复(0)