Linux shell编程学习笔记22: () $() (()) 的用法小结

最近学习Linux Shell编程,对 () (()) [] [[]]等符号的用法还是有点分不太清楚,于是决定再梳理一下。今天先整理 () $() (()) 的用法。

1 单小括号()

1.1 子shell(命令组)


括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用。括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括号之间不必有空格。

1.1.1 bash中

$ bash
[csdn ~]$ i=1; echo $i;(let i+=5; echo $i); echo $i
1
6
1
[csdn ~]$ 

 

1.1.2 在zsh中

# csdn @ edu in ~ [16:08:09] 
$ i=1; echo $i;(let i+=5; echo $i); echo $i
1
6
1

在上面的实例中,执行命令i=1; echo $i 时变量i初始为1

执行命令(let i+=5; echo $i);时,会创建一个子shell来执行,其中变量值i变为6

最后执行命令echo $i,母shell中的变量i的值并没有继承子shell中的变化,仍然为1


1.2 用于定义并初始化数组

如:

a=(1 2 3 4 a b c d)        

定义了数组 a并初始化其中的元素值。

1.3 用于条件判断

1.3.1 bash中

[csdn ~]$ i=1; if (test $i -lt 0); then; echo 'i<0'; else; echo 'i>=0'; fi
bash: syntax error near unexpected token `;'
[csdn ~]$ i=1;while (test $i -lt 10); do echo $i; let i++; done
1
2
3
4
5
6
7
8
9

1.3.2 在zsh中

# csdn @ edu in ~ [19:00:25] C:1
$ i=1; if (test $i -lt 0); then; echo 'i<0'; else; echo 'i>=0'; fi
i>=0

# csdn @ edu in ~ [19:00:46] 
$ i=1;while (test $i -lt 10); do echo $i; let i++; done          
1
2
3
4
5
6
7
8
9

# csdn @ edu in ~ [19:00:52] 
$ i=1;while (test $i < 10); do echo $i; let i++; done
zsh: no such file or directory: 10

# csdn @ edu in ~ [19:02:11] 
$ i=1;while (test $i != 10); do echo $i; let i++; done
1
2
3
4
5
6
7
8
9

2 $():命令替换

与` `(反引号)相似,都是用来作命令替换的,即,先完成()(小拓号)或` `(反引号)里的命令行,然后将其标准输出结果替换出来。

2.1 在bash中

[csdn ~]$ echo $(pwd;echo '\\n'; (cd /;echo path:;pwd); echo '\\n'; pwd)
/home/csdn \\n path: / \\n /home/csdn
[csdn ~]$ echo `pwd;echo '\\n'; (cd /;echo path:;pwd); echo '\\n'; pwd`
/home/csdn \n path: / \n /home/csdn
[csdn ~]$ echo `pwd;echo "\\n"; (cd /;echo path:;pwd); echo "\\n"; pwd`
/home/csdn \n path: / \n /home/csdn
[csdn ~]$ echo $(pwd;echo "\\n"; (cd /;echo path:;pwd); echo "\\n"; pwd)
/home/csdn \n path: / \n /home/csdn
[csdn ~]$ echo $(pwd;echo -e "\\n"; (cd /;echo path:;pwd); echo -e "\\n"; pwd)
/home/csdn path: / /home/csdn
[csdn ~]$ 

在上面的实例中,我们先执行pwd命令显示当前目录路径:/home/csdn

然后执行命令echo '\\n'来换行

接着打开一个子shell执行命令: (cd /;echo path:;pwd); 其中命令cd /将当前目录改为/,再用pwd显示当前目录路径:/

然后我们执行命令echo '\\n'来换行

最后再用pwd显示当前目录路径:/home/csdn

但是echo '\\n'命令没有实现换行,用了-e选项还是不行。

2.2 在zsh中

# csdn @ edu in ~ [17:21:47] 
$ echo $(pwd;echo '\\n'; (cd /;echo path:;pwd); echo '\\n'; pwd)
/home/csdn 
 path: / 
 /home/csdn

# csdn @ edu in ~ [17:22:07] 
$ echo `pwd;echo '\\n'; (cd /;echo path:;pwd); echo '\\n'; pwd`
/home/csdn path: / /home/csdn

同样的命令,在zsh中执行正确,换行也生效了。

注:有些shell不支持这种使用方法,如tcsh。

3 双小括号(()):整数运算、进制转换

3.1 整数运算、比较

3.1.1 在bash中

# csdn @ edu in ~ [22:20:39] 
$ bash
[csdn ~]$ echo $((3+5))
8
[csdn ~]$ echo $((8 > 6))
1
[csdn ~]$ echo $((5+3 > 6))
1
[csdn ~]$ 

3.1.2 在zsh中

[csdn ~]$ zsh

# csdn @ edu in ~ [22:19:50] 
$ echo $((3+5))      
8

# csdn @ edu in ~ [22:20:11] 
$ echo $((8 > 6))
1

# csdn @ edu in ~ [22:20:27] 
$ echo $((3+5 > 6))
1

# csdn @ edu in ~ [22:20:39] 

3.2 进制转换

$(( ))可以将其他进制转成十进制数显示出来。用法如下:

$((N#x))

其中,N为进制,x为该进制下某个数值,命令执行后可以得到该进制数转成十进制后的值。
 

3.2.1 在bash中

$ bash
[csdn ~]$ echo $((2#1000))
8
[csdn ~]$ echo $((8#1000))
512
[csdn ~]$ echo $((16#1000))
4096
[csdn ~]$ echo $((16#1000 - 1000))
3096
[csdn ~]$ echo $((16#1000 - 1000  > 2000)) 
bash: 16#1000 - 1000  > 2000: syntax error: invalid arithmetic operator (error token is " > 2000")
[csdn ~]$ echo $(((16#1000 - 1000)  > 2000)) 
bash: (16#1000 - 1000)  > 2000: syntax error: operand expected (error token is " > 2000")
[csdn ~]$ echo $(( $(16#1000 - 1000)  > 2000)) 
bash: 16#1000: command not found
bash:  > 2000: syntax error: operand expected (error token is " > 2000")
[csdn ~]$ i=1000; $((16#$i-1000 > 2000))
bash: 1: command not found
[csdn ~]$ i=1000; $((16#${i}-1000 > 2000))
bash: 1: command not found

[csdn ~]$ echo $((16#1000  > 2000)) 
bash: 16#1000  > 2000: syntax error: invalid arithmetic operator (error token is " > 2000")
[csdn ~]$ 

在bash中,可以顺利完成进制转换,进制转换和运算,但进制转换和比较不成功。

3.2.2 在zsh中

# csdn @ edu in ~ [15:08:45] C:1
$ echo $((2#1000))
8

# csdn @ edu in ~ [15:08:52] 
$ echo $((8#1000))
512

# csdn @ edu in ~ [15:09:00] 
$ echo $((16#1000))
4096

# csdn @ edu in ~ [15:09:06] 
$ echo $((16#1000 - 1000))
3096

# csdn @ edu in ~ [15:11:31] 
$ echo $((16#1000 - 1000  > 2000)) 
1

在zsh中,可以顺利完成进制转换,进制转换和运算,进制转换、运算和比较。 

在这点上,zsh表现优于bash。

3.3 在(())中使用变量

3.3.1 在bash中

# csdn @ edu in ~ [15:24:06] 
$ bash
[csdn ~]$ i=5;echo $((i+9))
14
[csdn ~]$ i=12; echo $((8#i+9))
bash: 8#i: value too great for base (error token is "8#i")
[csdn ~]$ i=12; echo $((8#${i}+9))
19
[csdn ~]$ i=12; echo $((8#$i+9))
19
[csdn ~]$ i=12; echo $((8#$i+9 > 10))
1
[csdn ~]$ 

3.3.2 在zsh中

 csdn @ edu in ~ [15:22:38] 
$ i=5; echo $((i+9))
14

# csdn @ edu in ~ [15:23:00] 
$ i=12; echo $((8#i+9))
zsh: bad math expression: operator expected at `i+9'

# csdn @ edu in ~ [15:23:23] C:1
$ i=12; echo $((8#${i}+9)) 
19

# csdn @ edu in ~ [15:23:34] 
$ i=12; echo $((8#${i}+9 > 10))
1

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

但也有例外。比如:

i=12; echo $((8#i+9))

bash和zsh都无法识其中的变量i,于是我们要 用 $i 或 ${i}把变量i标记出来。

3.4 总结

shell类型整数运算比较算术&比较进制转换进制转换&算术&比较
bash×
zsh

3.5 注意

(( )) 只能用于整数算,不能用于小数(浮点数)或者字符串。要进行小数运算,可以使用 bc 命令。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/124704.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用vite搭建一个vue3 + ts项目

搭建项目 参考连接https://www.jianshu.com/p/1ce93c7e15a0 练手项目参考 https://www.xuexiluxian.cn/ 1.安装pina vue3 pinia的安装和使用 2.安装router npm install vue-router -S Vue3: Vue-router路由的使用

什么是跨境电商独立站?有什么优势和劣势?

你是否有过这样的经历&#xff1a;当你在网上浏览一些商品时&#xff0c;发现有些网站的域名很奇怪&#xff0c;比如.com、.net、.co等&#xff0c;而且网站的界面和设计也和国内的电商平台不太一样。 你可能会好奇&#xff0c;这些网站是什么&#xff1f;它们是怎么做的&…

学习笔记|Pearson皮尔逊相关系数|Spearman斯皮尔曼相关系数|和Kendall肯德尔tau-b相关系数|分析流程|-SPSS中双变量相关性分析系数

目录 学习目的软件版本原始文档基础概念皮尔逊相关系数基本假设&#xff08;适用条件&#xff09;&#xff1a;系数的范围及意义实例1. 读数据&#xff1a;2.正态性检验&#xff1a;3.异常值检验&#xff08;体重&#xff09;&#xff1a;4.分析&#xff1a; 斯皮尔曼相关系数基…

Git的入门详细教程

&#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; ​​ &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《git》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有一定基础的程序员&#xff0c;这…

企业级,搭建接口自动化测试框架思路分析,8年测试老鸟整理...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 在选择接口测试自…

Vue3 学习笔记

vue3 官网&#xff1a;简介 | Vue.js (vuejs.org) 1. 环境搭建与启动 npm create vuelatest 这一指令将会安装并执行 create-vue&#xff0c;它是 Vue 官方的项目脚手架工具 之后&#xff0c;你将会看到一些诸如 TypeScript 和测试支持之类的可选功能提示&#xff1a; ✔ …

学习笔记|SPSS|描述变量|按照3倍标准差剔除异常值|标准化值另存为变量|剔除个案|Zscore|箱图|Zscore取值范围

目录 学习目的软件版本原始文档概述服从正态分布-按照3倍标准差剔除异常值读数据数据概览描述变量 正态性检验异常值检验及剔除 非正态分布-根据Zscore取值范围确定基础数据数据概览正态性检验Tips&#xff1a;箱图圆圈的含义 异常值检验及剔除描述变量&#xff0c;并将标准化值…

C语言C位出道心法(三):共用体|枚举

C语言C位出道心法(一):基础语法 C语言C位出道心法(二):结构体|结构体指针|链表 一: C语言共用体数据类型认知 二:C语言枚举基本数据类型认知 忙着去耍帅,后期补充完整.............

Verilog刷题[hdlbits] :Alwaysblock2

题目&#xff1a;Alwaysblock2 For hardware synthesis, there are two types of always blocks that are relevant: 对于硬件综合&#xff0c;有两种相关的always块&#xff1a; Combinational: always () 组合型&#xff1a;always ()Clocked: always (posedge clk) 时钟型…

Python实现图片与PDF互相转换

目录 图片转PDF文件夹所有图片转为1个PDF文件夹指定图片转为1个PDF文件夹所有图片分别转为PDF举例 PDF转图片指定PDF转为图片文件夹所有PDF转为图片举例 图片转PDF 之前的一篇博客《Python合并拼接图片》&#xff0c;可对图片进行合并拼接 使用前需要安装PyMuPDF库&#xff0c…

设置区块链节点输出等级为警告级,并把日志存储阈值位100MB并验证;

题目 获取指定区块链节点输出等级为警告级&#xff0c;并设置日志存储阈值位100MB并验证&#xff1b; 操作步骤 1.切换目录 cd nodes/127.0.0.1/node0 2.打开配置文件并修改 vim config.ini warn&#xff1a;警告

力扣最热一百题——每日温度

Python后面的文章&#xff0c;内容都比较多&#xff0c;但是同时我又想保持每天更新的速度&#xff0c;所以Python的文章我继续打磨打磨&#xff0c;先更新一篇算法的文章。 一身正气报国家&#xff0c;旁无乱境不恋她 ヾ(◍∇◍)&#xff89;&#xff9e; 力扣题号&#xff1a…

大语言模型比武

今年随着 ChatGPT 的流行&#xff0c;并在各个领域有一定程度生产级别的应用。国内外也掀起了一股大语言模型浪潮&#xff0c;各大厂商都推出了自己的大语言模型&#xff0c;阿里推出了 通义千问&#xff0c;腾讯推出了 Hunyuan&#xff0c;亚马逊云推出了 Titan&#xff0c;大…

微服务-grpc-consul-protoBuf-micro

微服务 一、微服务&#xff08;microservices&#xff09; 近几年,微服这个词闯入了我们的视线范围。在百度与谷歌中随便搜一搜也有几千万条的结果。那么&#xff0c;什么是微服务 呢&#xff1f;微服务的概念是怎么产生的呢&#xff1f; 我们就来了解一下Go语言与微服务的千丝…

C++ 断言

1.断言的概念 断言(assertion)是一种编程中常用的手段。在通常情况下&#xff0c;断言就是将一个返回值总是需要为真的判别式放在语句中&#xff0c;用于排除在设计的逻辑上不应该产生的情况。比如一个函数总需要输人在一定的范围内的参数&#xff0c;那么程序员就可以对该参数…

汽车标定技术(五)--基于模型开发如何生成完整的A2L文件(1)

1 数据对象的创建 CtrlH打开Model Explorer&#xff0c;在Base workspace中点击工具栏add&#xff0c;出现如下界面&#xff0c; 可以看到Simulink提供了多种数据类型 Matlab Variable&#xff1a;Simulink.Parameter&#xff1a;使用该数据对象表示工程应用中的标定量Simuli…

CSS 渐变、文本效果、字体

一、CSS3渐变&#xff1a; CSS3渐变&#xff08;gradient&#xff09;可以在两个或多个指定的颜色之间显示平稳的过渡。CSS3定义了两种类型的渐变&#xff08;gradient&#xff09;&#xff1a;线性渐变&#xff08;linear gradient&#xff09;-向下/向上/向左/向右/对角方向…

MySQL–第4关:查询用户日活数及支付金额

MySQL–第4关&#xff1a;查询用户日活数及支付金额 – WhiteNights Site 标签&#xff1a;MySQL 非常好的题&#xff0c;爱来自中国。 题目 没啥用 任务描述 现有3张业务表&#xff0c;详见如下: 需要输出结果如下&#xff0c;没有支付的日期不需要显示&#xff0c;请写出对…

设计模式——建造者模式

目录 建造者模式盖房项目需求基本介绍四个角色实例代码注意事项和细节抽象工厂模式 VS 建造者模式 建造者模式 盖房项目需求 传统方式&#xff1a;打地基&#xff0c;砌墙&#xff0c;封顶 盖房子步骤 public abstract class AbstractHouse {// 地基public abstract void b…

【小白专用】PHP中的JSON转换操作指南 23.11.06

一、JSON的基础知识 1.1JSON数据格式 JSON数据格式是一组键值对的集合&#xff0c;通过逗号分隔。键值对由“键”和“值”组成&#xff0c;中间使用冒号分隔。JSON数据格式可以嵌套&#xff0c;而且可以使用数组 二、PHP中的JSON函数 JSON的操作需要使用编程语言进行处理&am…