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

news2024/10/6 22:23:43

最近学习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 命令。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Web逆向-mtgsig1.2简单分析

{"a1": "1.2", # 加密版本"a2": new Date().valueOf() - serverTimeDiff, # 加密过程中用到的时间戳. 这次服主变坏了, 时间戳需要减去一个 serverTimeDiff(见a3) ! "a3": "这是把xxx信息加密后提交给服务器, 服主…

马斯克:让我成功的其实是“第一性原理”(PM必读)

大家好&#xff0c;我是老原。 关注我比较久的老粉都知道&#xff0c;我是从产品经理转到项目经理&#xff0c;然后才到现在的PMO。 在做产品的时&#xff0c;关注点在于如何把产品做好&#xff0c;在接触到项目后&#xff0c;更多的是去关注如何把项目做好&#xff0c;也是出…

服务号怎么改成订阅号

服务号和订阅号有什么区别&#xff1f;服务号转为订阅号有哪些作用&#xff1f;在推送频率上来看&#xff0c;服务号每月能推送四条消息&#xff0c;而订阅号可以每天&#xff08;24小时&#xff09;推送一条消息。如果企业开通公众号的目的是提供服务&#xff0c;例如售前资讯…

详解--Hash(中文也称散列、哈希)

参考链接 参考链接2 1. hash 概念 1.1 什么是 hash Hash 也称散列、哈希&#xff0c;对应的英文都是 Hash。 基本原理就是把任意长度的输入&#xff0c;通过 Hash 算法变成固定长度的输出。这个映射的规则就是对应的 Hash 算法&#xff0c;而原始数据映射后的二进制串就是哈希…

alpha融合详解(alpha compositing)

alpha融合简介 alpha融合&#xff08;alpha compositing&#xff09;是图像处理中常用技术&#xff0c;常见的公式如下&#xff1a; C O α C A ( 1 − α ) C B (1) C_O \alpha C_A (1-\alpha)C_B \tag{1} CO​αCA​(1−α)CB​(1) 其中 C A C_A CA​&#xff0c; C B C…

43 深度学习(七):循环神经网络略谈:embedding|RNN|LSTM

文章目录 embeddingembedding的原理相关的代码演示 RNN出现的原因基本原理RNN基本代码------只取hn简单的RNN------取整个sequence简单RNN的局限 LSTM原理介绍LSTM------只取hn 以及双向处理 RNN的改进stack改进Bidirectional 改进embedding改进 embedding 在语句处理方面&…

华为防火墙基本原理工作方法总结

防火墙只会对tcp首包syn建立会话表&#xff0c;其它丢掉&#xff0c;如synack&#xff0c;ack udp直接建立会话表 icmp只对首包请求包建立会话表&#xff0c;其它包&#xff0c;如应答的不会建立直接丢掉 防火墙状态查看&#xff1a; rule name trust_untrust source-zone tru…

您与1秒钟测量两千个尺寸之间仅差一台智能测径仪!

随着产线的发展&#xff0c;自动化程度越来越高&#xff0c;生产速度越来越快&#xff0c;人们对产品的品质要求越来越高&#xff0c;对检测也提出了更高的要求。传统的检测与测量手段已经很难满足测量效率要求&#xff0c;业内迫切需要一种新型高效率的测量设备。 产线多种多样…

[ACTF2020 新生赛]Upload 1

题目环境&#xff1a; 仍旧是文件上传漏洞 这道题和上一道大差不差、大同小异、这里不再赘述。 [极客大挑战 2019]Upload 1&#xff1a;https://blog.csdn.net/m0_73734159/article/details/134267317?spm1001.2014.3001.5501 区别在于本题需要在抓包数据里面改文件后缀&#…

大语言模型幻觉解决方案综述

论文题目&#xff1a;《Cognitive Mirage: A Review of Hallucinations in Large Language Models》 论文链接&#xff1a;https://arxiv.org/abs/2309.06794v1 论文代码&#xff1a;https://github.com/hongbinye/cognitive-mirage-hallucinations-in-llms 技术交流群 建了…

编写软件产品使用说明书的重要技巧分享

编写软件产品使用说明书是确保用户能够准确了解和使用你的软件的重要一步。一份清晰、详尽的软件产品使用说明书不仅可以提高用户满意度&#xff0c;也能减少用户的疑惑和困惑。然而&#xff0c;要编写一份优秀的软件产品使用说明书并不容易。接下来就跟大家分享一些我的经验和…

使用JMeter创建FTP测试计划

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

Leetcode-234 回文链表

我的解法&#xff1a;使用栈&#xff0c;定义了len略微复杂&#xff0c;拿链表的后半部分和前半部分比较即可&#xff0c;没必要全部比较 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* List…

YOLO目标检测——路标检测数据集【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;路标检测数据集在自动驾驶、交通安全监控、导航系统、城市规划和车辆行为分析等领域都有广泛应用的潜力数据集说明&#xff1a;路标检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富&#xff0c;含有停止标志、速度限制标志、…

【编程语言发展史】Unity开发语言的历史发展

Unity开发前期版本时&#xff0c;使用的是一种名为UnityScript的类似JavaScript的语言。然而&#xff0c;随着时间的推移&#xff0c;开发者社区大多数人都倾向于使用C#进行开发&#xff0c;Unity决定将重点放在C#上&#xff0c;因为C#具有更强大的生态系统、更好的性能和更广泛…

基于wechaty实现聊天机器人(微信自动回复)

最终效果 返回前端一个二维码&#xff0c;扫码登录后&#xff0c;机器人将上线&#xff0c;根据后端node内代码实现自动回复等功能 初始化项目 npm init -y安装 wechaty 核心包 npm i wechaty wechaty-puppet wechaty-puppet-padlocal安装 qrcode-terminal 用于终端输出二…

【GO】项目import第三方的依赖包

目录 一、导入第三方包 1.执行命令 2.查看go环境变量参数 3.查看go.mod文件的变化情况 二、程序里如何import 1. import依赖包 2. 程序编写 本次学习go如果依赖第三方的包&#xff0c;并根据第三方的包提供的接口进行编程&#xff0c;这里需要使用go get命令。下面将go…

【IP固定】地平线开发板如何实现重启IP地址不变

文章目录 1 背景2 临时解决方案3 真正解决方案 1 背景 重新刷了地平线工具链OE包中BSP20230417的系统镜像&#xff0c;结果只能串口连接&#xff0c;无法实现网口连接&#xff0c;串口连接后&#xff0c;发现eth0和eth1的IP竟然是一样的&#xff0c;如下图所示 还挺少见的。 …

基于单片机的多层电梯控制仿真系统

**单片机设计介绍&#xff0c; 基于单片机的多层电梯控制仿真系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的多层电梯控制仿真系统是一个复杂的系统&#xff0c;它需要结合单片机技术、控制理论、电子技术以及人…

C# 继承,抽象,接口,泛型约束,扩展方法

文章目录 前言模拟需求场景模拟重复性高的需求初始类结构继承优化抽象类 需求1&#xff1a;打印CreateTime方法1&#xff1a;使用重载方法2&#xff1a;基类函数方法3&#xff1a;泛型约束方法3.1&#xff1a;普通泛型方法方法3.2&#xff1a;高级泛型约束&#xff0c;扩展方法…