shell中$(( ))、$( )、``与${ }的区别详解
命令替换
在bash中,$( )与` `(反引号)都是用来作命令替换的。
命令替换与变量替换差不多,都是用来重组命令行的,先完成引号里的命令行,然后将其结果替换出来,再重组成新的命令行
[python@master2 shell]$ echo today is $(date "+%Y-%m-%d")
today is 2019-03-04
[python@master2 shell]$ echo today is `date "+%Y-%m-%d"`
today is 2019-03-04
$( )与`` 在操作上,这两者都是达到相应的效果,但是建议使用$( ),理由如下:
``很容易与''搞混乱,尤其对初学者来说,而$( )比较直观。
最后,$( )的弊端是,并不是所有的类unix系统都支持这种方式,但反引号是肯定支持的。
[python@master2 shell]$ echo Linux `echo Shell `echo today is `date "+%Y-%m-%d"```
Linux Shellecho today is 2019-03-04
[python@master2 shell]$
[python@master2 shell]$ echo Linux `echo Shell $(echo today is $(date "+%Y-%m-%d"))`
Linux Shell today is 2019-03-04
[python@master2 shell]$
[python@master2 shell]$ echo Linux $(echo Shell $(echo today is $(date "+%Y-%m-%d")))
Linux Shell today is 2019-03-04
${ }变量替换
一般情况下,$var与${var}是没有区别的,但是用${ }会比较精确的界定变量名称的范围
[python@master2 shell]$ A=Hello
[python@master2 shell]$ echo $A
Hello
[python@master2 shell]$ echo $AB #表示变量AB
[python@master2 shell]$
[python@master2 shell]$ echo ${A}B #表示变量A后连接着B
HelloB
取路径、文件名、后缀
# 是去掉左边(在键盘上 # 在 $ 之左边)
% 是去掉右边(在键盘上 % 在 $ 之右边)
单一符号是最小匹配;两个符号是最大匹配
* 是用来匹配不要的字符,也就是想要去掉的那部分
还有指定字符分隔号,与*配合,决定取哪部分
[python@master2 shell]$ file=/dir1/dir2/dir3/my.file.txt
[python@master2 shell]$ echo ${file#*/} 一个#匹配第一个/左边的不要
dir1/dir2/dir3/my.file.txt
[python@master2 shell]$ echo ${file##*/} 两个#匹配最后一个/左边的不要
my.file.txt
[python@master2 shell]$ echo ${file%/*} %最后一个/及其右边的所有字符
/dir1/dir2/dir3
[python@master2 shell]$ echo ${file%%/*} 拿掉第一个/及其右边的字符串 (空)
数组
A="a b c def" # 定义字符串
A=(a b c def) # 定义字符数组

$(( ))与整数运算

[python@master2 shell]$ echo $((2*3))
6
[python@master2 shell]$ a=5;b=7;c=2
[python@master2 shell]$ echo $((a+b*c))
19
[python@master2 shell]$ echo $(($a+$b*$c))
19
(())重定义变量值
[python@master2 shell]$ a=5;b=7
[python@master2 shell]$ ((a++))
[python@master2 shell]$ echo $a
6
[python@master2 shell]$ ((a--));echo $a
5
[python@master2 shell]$ ((a<b));echo $?
0
[python@master2 shell]$ ((a>b));echo $?
1
随机推荐
- Python - 默认参数传参陷阱
def extend_list(v, li=[]): li.append(v) return li list1 = extend_list(10) print(list1) # [10] list2 ...
- Vue.js父子组件如何传值 通俗易懂
父子组件传值原理图 一般页面的视图App.vue应为这样 一.父组件向子组件传值 1.创建子组件,在src/components/文件夹下新建一个Child.vue 2.Child.vue的中创建pr ...
- powershell获取mac地址
> getmac > getmac | select-string "00" > $a = getmac | select-string "00&quo ...
- k8s集群部署(3)
一.利用ansible部署kubernetes集群环境准备 基于二进制方式部署和利用ansible-playbook实现自动化:既提供一键安装脚本,也可以分步执行安装各个组件,同时讲解每一步主要参数配 ...
- Linux系统调优相关工具
一.系统调优概述 系统的运行状况: CPU -> MEM -> DISK*-> NETWORK -> 应用程序调优 分析是否有瓶颈(依据当前应用需求) 调优(把错误的调正确) ...
- Spring-Kafka —— KafkaListener手动启动和停止
一.KafkaListener消费 /** * 手动提交监听. * * @param record 消息记录 * @param ack 确认实例 */ @Override @KafkaListener ...
- Java数组(3):创建测试数据
有时我们需要使用数组批量创建测试数据,接下来通过以下4点来举例. (1) 使用Arrays.fill()填充数据 (2) 使用Random类中JDK1.8提供的新方法用来生成随机数 (3) 一个随机数 ...
- 【Web网站服务器开发】Apache 和 Tomcat的区别及配置
Apache 和 Tomcat 都是web网络服务器,两者既有联系又有区别,在进行HTML.PHP.JSP.Perl等开发过程中,需要准确掌握其各自特点,选择最佳的服务器配置. apache是web服 ...
- 【操作系统】【C/C++开发】内存管理
内存管理 操作系统对内存的划分和动态分配,就是内存管理的概念.有效的内存管理在多道程序设计中非常重要,不仅方便用户使用存储器.提高内存利用率,还可以通过虚拟技术从逻辑上扩充存储器.内存管理的功能有: ...
- 数据结构与算法-stack
栈的本质是一种线性表,特殊的一种线性表 基本概念 概念 栈是一种特殊的线性表 栈仅能在线性表的一端进行操作 栈顶(Top):允许操作的一端 栈底(Bottom):不允许操作的一端 stack是一种线性 ...