(())、let、expr、bc等计算命令的使用语法和应用技巧

本文介绍了多种使用Shell脚本进行高效计算的方法,包括利用for循环、seq命令、let命令、bc命令等多种工具实现1到100的累加计算。此外,还探讨了不同计算方式的效率对比。

转自:原文地址:http://oldboy.blog.51cto.com/2561410/767862

思路集锦:
①.C语言型for循环结构及(())计算式shell脚本

[oldboy@student ~]$  cat for1.sh
#!/bin/sh
j=0
for((i=0; i<=100; i++))
do
    ((j=j+i))
done
echo $j

写成一行的命令行写法:

for((i=0; i<=100; i++));do ((j=j+i));done;echo $j


expr的效率低于(()),计算1加到100就有明显感觉。


③.使用seq命令加for循环语法及let命令计算式脚本
[oldboy@student ~]$  cat for3.sh
#!/bin/bash
sum=0
i=1
for i in `seq 100`
do
   let sum=sum+i
done

echo $sum


#!/bin/bash

let a=5+4 b=9-3

echo $a $b


#!/bin/bash

let "t1 = ((a = 5 + 3, b = 7 - 1, c = 15 - 4))"

echo "t1 = $t1, a = $a, b = $b"


let 为内建的整数运算

let 命令not found的时候,sudo dpkg-reconfigure dash

提示:seq命令的语法:
1.生成序列[1…LAST]
seq LAST
例:seq 5 表示序列为 1 2 3 4 5
[oldboy@student ~]$  seq 5
1
2
3
4
5

2. 生成序列[FIRST…LAST],步长为1
seq FIRST LAST
例:seq 2 5表示序列为  2 3 4 5
[oldboy@student ~]$  seq 2 5
2
3
4

5

3.生成序列[FIRST…LAST],步长为INCREMENT
seq FIRST INCREMENT LAST
例:seq 2 2 5表示序列为  2 4
[oldboy@student ~]$  seq 2 2 5
2
4

qustdjx@qustdjx-K42JZ:~/test$ seq 2 3 5
2
5

④.seq、tr、sed、bc联手完成计算的方法
[oldboy@student ~]$  seq 100 | tr '\n' '+'|sed 's#\+$#\n#g'|bc
5050
老男孩提示:
1)注意bc命令的计算用法。
2)注意seq、tr、sed 3个命令的用法。
3) 命令解释说明:
1.seq 100         ==>竖排打印1...100个数字。
2.tr '\n' '+'     ==>把1...100个数字的结尾换行标签全部换成加号,即得1+2+3...+100+。
3.sed 's#\+$#\n#g'==>拼接的字符串表达式结尾加号替换为换行(回车)符。
4.bc    ==>交给bc计算
qustdjx@qustdjx-K42JZ:~/test$ echo '4+8' |bc
12

⑤.(())的其它写法
[oldboy@student ~]$  cat for4.sh
#!/bin/bash
sum=0
for((i=1;i<=100;i++))
do
        sum=$((i+sum))
done
echo $sum
[oldboy@student ~]$  cat for5.sh
sum=0
for((i=1;i<=100;i++))
do
        sum=$((i+$sum))
done
echo $sum
提示:以上两结果都是对的

⑥.使用until语句及(())计算
[oldboy@student ~]$  cat until-1.sh
#!/bin/sh
i=1
until ((i >100 ))
do
  ((j=j+i))
  ((i++))
done
echo $j

⑦.使用while循环语句计算
[oldboy@A ~]$ cat while-1.sh
#!/bin/sh
i=1
while ((i <=100 ))
do
 ((j=j+i))
 ((i++))
done
echo $j
--------------
[oldboy@student ~]$  cat while-3.sh
#!/bin/sh
i=1
while [ $i -le 100 ] #same as while [[ $i -le 100 ]] or while [[ $i -le 100 ]]
do
  let j=j+i
  i=`expr $i + 1`    #same as ((i++)) or  let i=i+1
done
echo $j


⑧.使用数学公式直接计算※※※※※
[oldboy@student ~]$  cat gongshi.sh
#!/bin/sh
i=100
echo $((i*(i+1)/2))
---------
[oldboy@student ~]$  cat gongshi-2.sh
#!/bin/sh
i=100
((sum=i*(i+1)/2))
echo $sum
---------
[oldboy@student ~]$  echo $((100*(100+1)/2))
5050

3)在计算时,(())计算式比let,expr等更有效率。
-------------------------------------------------
⑨.拼接字符串计算表达式后结合bc求和计算方法
[oldboy@student ~]$  cat chars.sh
#!/bin/sh
chars=0
for ((i=1; $i<=100; i++ ));do
chars="$chars+$i"
done
echo $chars|bc
-------------------------------------------------
⑩.使用seq和awk实现
[oldboy@student ~]$  seq 100 |awk '{total+=$1} END {print total}'
5050
[oldboy@student ~]$  seq 100 |awk '{total=total+$1} END {print total}'
5050
-------------------------------------------------
①①.{}数字列表结合tr、bc方法
[oldboy@student ~]$  echo {1..100}|tr " " "+"|bc
5050

老男孩提示:
1){ }序列的用法
[oldboy@student ~]$  echo {1..10}
1 2 3 4 5 6 7 8 9 10
[oldboy@student ~]$  echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z

2)seq默认情况只能是竖立排序列(以\n为分隔符号)
[oldboy@student ~]$  seq 3
1
2
3
加个-s分隔符参数看看:
[oldboy@student ~]$  seq -s " " 3
1 2 3
提示:seq仅支持打印数字序列,不支持字符等。

①②.{}数字列表结合awk方法
[oldboy@student ~]$ echo {1..100}|tr " " "\n"|awk '{total+=$1} END {print total}'
5050
-------------------------------------------------
①③.{}数字列表for循环及计算命令方法
[root@student scripts]# cat for6.sh
#!/bin/sh
sum=0
for num in `echo {1..100}`
do
    sum=`expr $sum + $num`
done
echo $sum
-------------------------------------------------
①⑤.seq结合bc较少字符计算方法(压轴了,最少字符实现方法)
[oldboy@student ~]$ seq -s + 100|bc
5050
[oldboy@student ~]$ seq -s "+" 100|bc
5050

<think>我们正在讨论的是Linux系统中的expr命令,特别是它的计算方法。用户已经提供了几个引用,其中引用[1]引用[2]都提到了expr命令可以进行算术运算、字符串操作逻辑运算。引用[3]则提到了一些字符串操作的功能(如索引)以及算术运算的其他方法(如bc、dc等),但我们的重点是expr。 根据用户的问题,他/她想了解在Linux系统中使用expr进行计算的方法。因此,我们将重点介绍expr的算术运算功能。 expr的算术运算包括:加法、减法、乘法、除法求模(取余)运算。需要注意的是,expr命令在进行算术运算时,操作符操作数之间必须有空格,并且乘法运算符*需要转义(写成\*)以避免被shell解释为通配符。 基本语法expr 表达式 其中表达式由操作数操作符组成,例如:expr 2 + 3 我们将通过几个例子来说明expr的算术运算: 1. 加法:expr 10 + 5 # 输出15 2. 减法:expr 10 - 5 # 输出5 3. 乘法:expr 10 \* 5 # 输出50(注意:*前面必须加反斜杠转义) 4. 除法:expr 10 / 5 # 输出2 5. 取余:expr 10 % 3 # 输出1 另外,expr还可以进行逻辑运算比较运算,例如: - 相等比较:expr 10 = 5 # 输出0(表示假),注意等号两边有空格 - 大于:expr 10 \> 5 # 输出1(表示真),同样>需要转义(在有些shell中可能需要转义,避免被当作重定向) - 小于:expr 10 \< 5 # 输出0,同样<需要转义 但是,用户的问题主要集中在“计算方法”上,所以我们重点展示算术运算。 注意:expr命令只能处理整数运算,不支持浮点数。如果需要浮点运算,可以使用bc命令等。 示例脚本: ```bash #!/bin/bash # 算术运算示例 a=10 b=3 sum=`expr $a + $b` echo ": $sum" diff=`expr $a - $b` echo "差: $diff" # 乘法需要转义 product=`expr $a \* $b` echo "积: $product" quotient=`expr $a / $b` echo "商: $quotient" remainder=`expr $a % $b` echo "余数: $remainder" ``` 输出: : 13 差: 7 积: 30 商: 3 余数: 1 另外,expr还可以进行更复杂的表达式组合,但需要使用反引号或$()来获取表达式的值,并且注意运算符的优先级(expr中运算符优先级与常规数学优先级一致:先乘除后加减,可以使用圆括号来改变优先级,但圆括号在shell中有特殊含义,因此需要转义引用)。 例如:计算 (a + b) * c result=`expr \( $a + $b \) \* $c` 注意:括号也需要转义,并且括号前后要有空格。 然而,由于expr的整数运算限制需要转义的复杂性,现代shell脚本通常使用更简洁的算术扩展方式,如$(( ... ))。例如: sum=$((a + b)) product=$((a * b)) # 这里就不需要转义了 但expr的优点是跨平台兼容性(尤其是在一些较老的Unix系统上)。 总结:expr命令进行算术运算的基本方法就是使用空格分隔操作数运算符,注意转义特殊字符(如*、<、>、(、)等),并且只支持整数运算。 根据用户提供的引用,我们参考了[^1][^2]。 最后,我们可以生成几个相关问题: 1. 如何在Linux中进行浮点运算? 2. 除了expr,还有哪些命令或方法可以进行算术运算? 3. expr命令在字符串处理方面有哪些功能? 注意:用户要求使用中文回答,并且按照格式要求(数学表达式用$...$,独立公式用$$...$$),但在这个回答中,我们主要是命令示例,没有复杂的数学公式。不过,如果提到表达式,我们可以用行内数学格式,比如我们可以说:表达式类似于$a + b \times c$,但这里我们实际上不需要,因为我们的例子都是命令。 另外,在回答中引用的地方,我们在末尾添加引用标识,如[^1]。 </think>### Linux 系统中 expr 命令计算方法 `expr` 是 Linux 中用于基础计算命令行工具,支持**整数运算、字符串操作逻辑比较**。以下详细说明其计算方法: --- #### 一、算术运算(仅限整数) 语法:`expr 操作数1 运算符 操作数2` ⚠️ **注意事项**: 1. 运算符操作数之间必须有空格 2. 特殊符号(如 `*`, `(`, `)`)需用反斜杠转义 3. 仅支持整数,浮点数需用 `bc` 命令 | 运算符 | 功能 | 示例 | 输出 | |--------|------------|-------------------------|-------| | `+` | 加法 | `expr 20 + 5` | `25` | | `-` | 减法 | `expr 20 - 5` | `15` | | `\*` | 乘法 | `expr 20 \* 5` | `100` | | `/` | 除法 | `expr 20 / 3` | `6` | | `%` | 取模 | `expr 20 % 3` | `2` | | `(` `)` | 优先级控制 | `expr \( 20 + 5 \) \* 2` | `50` | > **脚本示例**:计算两数之 > ```bash > num1=15 > num2=8 > sum=$(expr $num1 + $num2) > echo "结果: $sum" # 输出 结果: 23 > ``` --- #### 二、逻辑比较运算 支持整数间的逻辑判断,返回 `1`(真)或 `0`(假): ```bash expr 20 \> 10 # 输出 1 (20>10为真) expr 20 \< 10 # 输出 0 (20<10为假) expr 20 = 20 # 输出 1 (相等) expr 20 != 10 # 输出 1 (不等) ``` --- #### 三、字符串操作 1. **长度计算** ```bash str="hello" expr length "$str" # 输出 5 ``` 2. **字符索引**(返回首次出现位置) ```bash expr index "abcdef" "cd" # 输出 3('c'在第3位)[^3] ``` 3. **子串匹配** ```bash expr substr "linux" 2 3 # 输出 inu(从第2位截取3字符) ``` --- #### ️ 重要限制与替代方案 1. **整数限制**: `expr 10 / 3` 输出 `3`(小数部分丢弃),浮点运算需用 `bc`: ```bash echo "scale=2; 10/3" | bc # 输出 3.33 ``` 2. **现代Shell替代方案**: ```bash # $(( )) 语法(无需转义) sum=$(( 20 * 5 )) # 输出 100 # let 命令 let "sum=20+5" # 输出 25 ``` --- #### 典型应用场景 - 简单脚本中的整数计算 - 日志处理时的字符串截取 - 条件判断中的数值比较 - 兼容老式Unix系统的脚本开发[^1][^2] > **为什么仍有用?** > 尽管 `$(( ))` `let` 更高效,但 `expr` 的跨平台兼容性(如 macOS 的旧版 Bash)使其在通用脚本中仍有价值[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值