Linux shell 中$() ` `,${},$[] $(()),[ ] (( )) [[ ]]作用与区别

本文深入探讨Bash Shell中的$()、``、${}

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

$()和 ` ` :

在 bash shell 中,$( ) 与 (反引号) 都是用来做命令替换用(commandsubstitution)的。

例如 version=$(uname -r)和version=uname -r都可以是version得到内核的版本号

各自的优缺点:

  1. ` ` 基本上可用在全部的 unix shell 中使用,若写成 shell script ,其移植性比较高。但反单引号容易打错或看错。

  2. $()并不是所有shell都支持。

${ } :

用 于 变 量 替 换 。 一 般 情 况 下 , { }用于变量替换。一般情况下, var 与${var} 并没有啥不一样。但是用 ${ } 会比较精确的界定变量名称的范围。比如

$ A=B
$ echo $AB
原本是打算先将 $A 的结果替换出来,然后再补一个 B 字母于其后,
但在命令行上,真正的结果却是只会提换变量名称为 AB 的值出来…
若使用 ${ } 就没问题了:
$ echo ${A}B
BB
${ }的功能远不止于此,详见下表。

在这里插入图片描述
在这里插入图片描述
eg:

#! /bin/bash

echo "============1_-_first不存在==============="
echo "second=zhang -"
second=zhang
val=${first-${second}}
echo ${val}
unset first second
echo "=========================================="

echo "=============2_-_first空=================="
echo "first=; second=zhang -"
first=; second=zhang
val=${first-${second}}
echo ${val}
unset first second
echo "=========================================="

echo "=============3_-_first非空================"
echo "first=yang; second=zhang -"
first=yang; second=zhang
val=${first-${second}}
echo ${val}
unset first second
echo "=========================================="

echo "==============4_:-_first不存在============"
echo "second=zhang :-"
second=zhang
val=${first:-${second}}
echo ${val}
unset first second
echo "=========================================="

echo "==============5_:-_first空================"
echo "first=; second=zhang :-"
first=; second=zhang
val=${first:-${second}}
echo ${val}
unset first second
echo "=========================================="

echo "==============6_:-_first非空=============="
echo "first=yang; second=zhang :-"
first=yang; second=zhang
val=${first:-${second}}
echo ${val}
unset first second
echo "=========================================="

echo "==============7_+_first不存在============="
echo "second=zhang +"
second=zhang
val=${first+${second}}
echo ${val}
unset first second
echo "=========================================="

echo "==============8_+_first空================="
echo "first=; second=zhang +"
first=; second=zhang
val=${first+${second}}
echo ${val}
unset first second
echo "=========================================="

echo "==============9_+_first非空==============="
echo "first=yang; second=zhang +"
first=yang; second=zhang
val=${first+${second}}
echo ${val}
unset first second
echo "=========================================="

echo "===============10_:+_first不存在=========="
echo "second=zhang :+"
second=zhang
val=${first:+${second}}
echo ${val}
unset first second
echo "=========================================="

echo "===============11_:+_first空=============="
echo "first=; second=zhang :+"
first=; second=zhang
val=${first:+${second}}
echo ${val}
unset first second
echo "=========================================="

echo "===============12_:+_first非空============"
echo "first=yang; second=zhang :+"
first=yang; second=zhang
val=${first:+${second}}
echo ${val}
unset first second
echo "=========================================="

echo "==============13_=_first不存在============="
echo "second=zhang ="
second=zhang
val=${first=${second}}
echo "first=${first}"
echo "var=${val}"
unset first second
echo "=========================================="

echo "==============14_=_first空================="
echo "first=; second=zhang ="
first=; second=zhang
val=${first=${second}}
echo "first=${first}"
echo "val=${val}"
unset first second
echo "=========================================="

echo "==============15_=_first非空==============="
echo "first=yang; second=zhang ="
first=yang; second=zhang
val=${first=${second}}
echo "first=${first}"
echo "val=${val}"
unset first second
echo "=========================================="

echo "===============16_:=_first不存在=========="
echo "second=zhang :="
second=zhang
val=${first:=${second}}
echo "first=${first}"
echo "val=${val}"
unset first second
echo "=========================================="

echo "===============17_:=_first空=============="
echo "first=; second=zhang :="
first=; second=zhang
val=${first:=${second}}
echo "first=${first}"
echo "val=${val}"
unset first second
echo "=========================================="

echo "===============18_:=_first非空============"
echo "first=yang; second=zhang :="
first=yang; second=zhang
val=${first:=${second}}
echo "first=${first}"
echo "val=${val}"
unset first second
echo "=========================================="


执行结果:
============1_-_first不存在===============
second=zhang -
zhang
==========================================
=============2_-_first空==================
first=; second=zhang -

==========================================
=============3_-_first非空================
first=yang; second=zhang -
yang
==========================================
==============4_:-_first不存在============
second=zhang :-
zhang
==========================================
==============5_:-_first空================
first=; second=zhang :-
zhang
==========================================
==============6_:-_first非空==============
first=yang; second=zhang :-
yang
==========================================
==============7_+_first不存在=============
second=zhang +

==========================================
==============8_+_first空=================
first=; second=zhang +
zhang
==========================================
==============9_+_first非空===============
first=yang; second=zhang +
zhang
==========================================
===============10_:+_first不存在==========
second=zhang :+

==========================================
===============11_:+_first空==============
first=; second=zhang :+

==========================================
===============12_:+_first非空============
first=yang; second=zhang :+
zhang
==========================================
==============13_=_first不存在=============
second=zhang =
first=zhang
var=zhang
==========================================
==============14_=_first空=================
first=; second=zhang =
first=
val=
==========================================
==============15_=_first非空===============
first=yang; second=zhang =
first=yang
val=yang
==========================================
===============16_:=_first不存在==========
second=zhang :=
first=zhang
val=zhang
==========================================
===============17_:=_first空==============
first=; second=zhang :=
first=zhang
val=zhang
==========================================
===============18_:=_first非空============
first=yang; second=zhang :=
first=yang
val=yang
==========================================

$[] $(()) :

它们是一样的,都是进行数学运算的。支持+ - * / %:分别为 “加、减、乘、除、取模”。但是注意,bash只能作整数运算,对于浮点数是当作字符串处理的。

例:
$ a=5; b=7; c=2
$ echo $(( a+b*c ))
19
$ echo $(( (a+b)/c ))
6
$ echo $(( (a*b)%c))
1

在 $(( )) 中的变量名称,可于其前面加 $ 符号来替换,也可以不用,如:
$(( $a + $b * $c)) 也可得到 19 的结果
此外,$(( )) 还可作不同进位(如二进制、八进位、十六进制)作运算呢,只是,输出结果皆为十进制而已:
echo $((16#2a)) 结果为 42 (16进位转十进制)

[ ] :

即为test命令的另一种形式。

但要注意许多:

1.你必须在左括号的右侧和右括号的左侧各加一个空格,否则会报错。

2.test命令使用标准的数学比较符号来表示字符串的比较,而用文本符号来表示数值的比较。很多人会记反了。使用反了,shell可能得不到正确的结果。

3.大于符号或小于符号必须要转义,否则会被理解成重定向。

(( ))及[[ ]] :

它们分别是[ ]的针对数学比较表达式和字符串表达式的加强版。

其中(( )),不需要再将表达式里面的大小于符号转义,除了可以使用标准的数学运算符外,还增加了以下符号:
在这里插入图片描述
在这里插入图片描述

具体还可以看Linux 命令行与shell脚本编程大全

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值