【Shell 编程指南】shell运算操作符之(())

简介: 【Shell 编程指南】shell运算操作符之(())

Shell (( )) 的用法与深入解析

1. 基础用法

Shell (( )) 的用法双小括号 (( )) 的语法格式为:

((表达式))

通俗地讲,就是将数学运算表达式放在(())之间。

运算操作符/运算命令 说明
((a=10+66)**((b=a-15))
((c=a+b))**
**这种写法可以在计算完成后给变量赋值。以 ((b=a-15)) 为例,即将 a-15 的运算结果赋值给变量 c。
注意,使用变量时不用加$前缀,(( )) 会自动解析变量名。**
**a=$((10+66)****b=$((a-15))
c=$((a+b))**
*可以在 (( )) 前面加上***$符号获取 (( )) 命令的执行结果,也即获取整个表达式的值。以 c=$((a+b)) 为例,即将 a+b 这个表达式的运算结果赋值给变量 c。注意,类似 c=((a+b)) 这样的写法是错误的,不加$**就不能取得表达式的结果。
((a>7 && b==c)) (( )) 也可以进行逻辑运算,在 if 语句中常会使用逻辑运算。
echo $((a+10)) *需要立即输出表达式的运算结果时,可以在 (( )) 前面加***$**符号。
((a=3+5, b=a+10)) 对多个表达式同时进行计算。

2. 运算符优先级

在 (( )) 中,运算符的优先级与大多数编程语言相似。例如,乘法和除法优先于加法和减法。

#!/bin/bash
((result = 2 + 3 * 4))  # 先进行乘法运算,然后加法
echo "result=$result"  # 输出 result=14

3. 位运算与逻辑运算

除了基础的数学运算,(( )) 还支持位运算和逻辑运算。

#!/bin/bash
((result = (5 & 3) | (4 >> 1)))  # 位运算
echo "result=$result"  # 输出 result=1
((result = !(5 < 3)))  # 逻辑非运算
echo "result=$result"  # 输出 result=1

4. 自增与自减

(( )) 中还支持自增(++)和自减(–)运算符。

#!/bin/bash
((a = 5))
((a++))
echo "a=$a"  # 输出 a=6

5. 条件判断与循环

(( )) 常用于 ifwhile 语句中进行条件判断和循环。

#!/bin/bash
a=0
while ((a < 5)); do
  echo "a=$a"
  ((a++))
done

这里,我们使用了 while ((a < 5)) 来进行循环条件的判断,这样的写法更加直观和简洁。


在 (( )) 中使用变量无需加上$前缀,(( )) 会自动解析变量名,这使得代码更加简洁,也符合程序员的书写习惯。

#!/bin/bash
((a=2+8*2))
echo "a=$a"
b=$((7+2**4-4%3)) #运算后将结果赋值给变量,变量放在了括号的外面。
echo "b=$b"
echo $((1+2**3-4%3)) #也可以直接将表达式的结果输出,注意不要丢掉 $ 符号。
c=$((100*(100+1)/2)) #利用公式计算1+2+3+...+100的和。
echo "c=$c"
echo $((3<8))  #3<8 的结果是成立的,因此,输出了 1,1 表示真
if ((8>7&&7==5)) #进行逻辑判断
then
 echo yes
else
 echo no
fi

6. 深度见解

在编程中,我们经常需要进行数学运算和逻辑判断。(( )) 的出现,不仅简化了代码,也让我们能更专注于解决问题本身,而非纠结于语法细节。这种简化反映了人们对工具使用的本能需求,即工具应当是解决问题的“延伸”,而不是问题本身。

正如 Bjarne Stroustrup 在《The C++ Programming Language》中所说:“我们不能让程序员整天都在做与问题无关的工作。”

7. 源码实现

在 Linux 源码中,这些 Shell 命令和运算符是通过一系列底层的系统调用来实现的。具体来说,你可以在 Bash 的源码中找到这些实现,例如在 arith.c 文件中。

结语:编程、思考与持续成长

在编程的世界里,每一行代码都是一种表达,每一个问题都是一个挑战。正如我们在本文中探讨的 Bash 脚本,简单的代码背后往往蕴含着丰富的思考和解决问题的智慧。编程不仅是一种技术活动,更是一种思维的锻炼和人类创造力的体现。

正如Bjarne Stroustrup在《The C++ Programming Language》中所说:“编程是理解的艺术。”

从编程的角度看,每一个错误、每一个挑战都是一次成长的机会。这些“错误”实际上是我们与计算机、与问题、甚至与自己内心的一次深度对话。它们不仅仅是困扰,更是一种启示,引导我们去优化思维,去完善解决方案。

我诚挚地邀请大家加入这场关于编程和思考的旅程。无论你是编程的新手,还是经验丰富的开发者,都请不吝赐教,分享你的见解和经验。你的每一次互动,无论是点赞、评论、分享还是关注,都是对我持续创作和分享的最大鼓励和支持。

感谢你花时间阅读这篇文章,如果你觉得有价值,请不要忘记收藏和分享。也欢迎你对博客内容提出宝贵的建议和问题,因为每一个问题都可能是下一篇文章的起点。

让我们一起,在编程的道路上,持续学习,持续成长。

“代码如诗,智慧如光。” —— 未知

感谢阅读,期待与你再次相遇在编程和思考的交汇点。

目录
相关文章
|
11天前
|
监控 Shell 开发工具
Shell编程
Shell编程
|
30天前
|
存储 Java Shell
bigdata-04-shell编程基础
bigdata-04-shell编程基础
13 0
|
1月前
|
Shell Linux C++
【Shell 编程设计】 编写自己的清理后台的Shell脚本
【Shell 编程设计】 编写自己的清理后台的Shell脚本
33 1
|
1月前
|
存储 Shell 数据安全/隐私保护
【Shell 编程指南】Shell read命令 (从标准输入读取数值)
【Shell 编程指南】Shell read命令 (从标准输入读取数值)
26 0
|
1月前
|
Shell C语言 C++
【Shell 编程指南】shell中的(),{}几种语法用法
【Shell 编程指南】shell中的(),{}几种语法用法
17 0
|
1月前
|
算法 Shell Linux
【Shell 命令集合 文档编辑 内建命令】Linux数值运算和赋值操作 let命令使用指南
【Shell 命令集合 文档编辑 内建命令】Linux数值运算和赋值操作 let命令使用指南
26 0
|
7天前
|
Java 关系型数据库 MySQL
Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
【4月更文挑战第12天】Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
36 3
|
2天前
|
弹性计算 运维 Shell
每天解析一个shell脚本(61)
【4月更文挑战第26天】shell脚本解析及训练(61)
14 3
|
2天前
|
弹性计算 运维 Shell
每天解析一个shell脚本(58)
【4月更文挑战第26天】shell脚本解析及训练(58)
68 0
|
2天前
|
弹性计算 Shell 数据安全/隐私保护
每天解析一个shell脚本(56)
【4月更文挑战第26天】shell脚本解析及训练(56)
14 0