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

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 几十倍!

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...