Linux Shell 中各种括号的使用: ${} $() $[] [] $(()) [[]] (())

本文深入解析了Shell脚本中的变量操作与命令替换技巧,包括变量引用、字符串截取、算术运算、条件判断等核心功能。通过具体示例,展示了如何利用${}

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

1、 ${} : 引用变量,还有一些其他的功能:

​fname=/aa1/aa2/aa3/dd.ee.txt

#: 从左边开始找起。##就是从那一边找起的最后一个
${fname#*/}      去掉左边第一个 / 及其左边的字符串:aa1/aa2/aa3/dd.ee.txt
${fname##*/}    去掉左边最后一个 / 及其左边的字符串:dd.ee.txt
${fname#*.}      去掉左边第一个 . 及其左边的字符串:ee.txt
${fname##*.}    去掉左边最后一个 . 及其左边的字符串:txt

%:从右边开始找起。%%就是从那一边找起的最后一个
${fname%/*}     去掉右边第一个 / 及其右边的字符串:/aa1/aa2/aa3
${fname%%/*}  去掉右边最后一个 / 及其右边的字符串:(空值)
${fname%.*}     去掉右边第一个 . 及其右边的字符串:/aa1/aa2/aa3/dd.ee
${fname%%.*}  去掉右边最后一个 . 及其右边的字符串:/aa1/aa2/aa3/dd

使用冒号(:) 截取一段字符串,${str:start:length}
${fname:0:3}  截取index从0开始的 4 个字节:/aa1
${fname:4:4}  截取index从4开始的 4 个字节:/aa2

使用单斜杠(/)和双斜杠(//)对变量值里的字符串作替换
${fname/aa/folder}  将第一个 aa 替换为 folder:/folder1/aa2/aa3/dd.ee.txt
${fname//aa/folder}  将全部 aa 替换为 folder:/folder1/folder2/folder3/dd.ee.txt

使用井号(#)计算字符串的长度: ${#string} 
echo ${#fname} :22

bash数组的使用:

定义数组: arr=(a b c d)
${arr[@]} 和 ${arr[*]} 相同,都是返回整个数组,包括四个元素。
通过中括号及下表获取其中的某一个元素:${arr[0]} 得到 a (第一个元素),${arr[1]} 第二个...
使用井号(#)计算数组的长度:${#arr[@]} 或 ${#arr[*]} => 4
(使用井号计算长度时,若参数为字符串则返回字符串的长度,若参数为数组则返回数组中元素的个数。)

 

2、$() 与 ``的作用相同,都是用来运行命令的

例如: echo `echo hello` 与 echo $(echo hello) 都是打印出hello。

需要注意的一点是有的shell是不支持$()的,而``则可以在所有的unix shell中使用。

 

3、$[] 和 $(()) 都是用来进行整数运算的

在$[] 和 $(())中进行算数运算时,变量前加不加$符号是一样的:

a=10;b=20;

echo $(($a+$b))

echo $[$a+$b]

echo $(($a+$b))

echo $[$a+$b]

以上四个的结果都是30。

$(()) 还可以将不同进制(如二进制、八进位、十六进制)的值转为十进制: $((BS#number)),BS为进制,number为数值。

例如:echo $((16#2b)) => 43 (16进制转十进制)

 

4、[] 主要用于字符串比较和整数比较

字符串比较时可用 == 和 != ,而整数比较时要使用 (-eq:等于;-ne:不等于;-gt:大于;-lt :小于;-ge:大于等于;-le:小于等于;)。

 

5、(())及[[]] 都是 [] 的加强版,在比较整数时可直接使用操作符(&&、||、<、>)

 

 

 

 

<think>嗯,用户问的是Linux Shell$()的含义和用法。首先,我需要回想一下自己学过的知识,确定$()的作用。记得$()是用来命令替换的,也就是执行括号里的命令并用输出结果替换整个表达式。比如,echo $(ls)会先执行ls命令,然后把结果输出。 接下来,我需要确认是否正确。比如,和反引号``的区别,$()是否更推荐使用,因为它支持嵌套,而且可读性更好。然后,要想到具体的例子,比如变量赋值、字符串拼接、结合其他命令使用的情况。同时,可能要注意转义字符的处理,比如括号里有特殊符号时是否需要转义。 然后,参考用户提供的引用内容,虽然引用里主要讲的是$0、$1、$#这些参数,但用户现在问的是$(),所以可能需要结合其他知识,但引用中没有直接提到$(),所以需要依靠自己的知识库回答。 还要考虑用户可能的实际使用场景,比如在脚本中获取命令输出,或者动态生成文件名等。同时,用户可能会混淆$()${},需要指出两者的不同,${}是变量替换,而$()是命令替换。 最后,确保回答结构清晰,有基本概念、用法示例、注意事项,以及相关问题。可能用户还想知道与反引号的对比,或者嵌套的使用方法,这些都应该包含在回答里。另外,语法正确性和中文表达也要注意,避免技术错误。</think>### Linux Shell中`$()`的含义及用法 #### 基本概念 在Linux Shell中,`$()`称为**命令替换**语法,其核心作用是将括号内的命令执行后,用**标准输出结果替换整个表达式**。例如,`echo $(date)`会先执行`date`命令,再将其输出结果作为字符串传递给`echo`打印[^1][^2][^3]。 #### 核心用法 1. **变量赋值与命令输出结合** ```bash current_time=$(date +%H:%M:%S) echo "当前时间: $current_time" ``` 此处`date +%H:%M:%S`的输出会直接赋值给变量`current_time`。 2. **字符串拼接与动态内容生成** ```bash echo "系统内核版本: $(uname -r)" ``` 输出类似:`系统内核版本: 5.15.0-78-generic` 3. **嵌套命令替换** ```bash file_count=$(ls $(pwd) | wc -l) ``` 该命令先通过`$(pwd)`获取当前目录路径,再统计其文件数量。 4. **与管道符结合使用** ```bash modified_files=$(git status | grep "modified:" | awk '{print $2}') ``` 筛选Git中已修改的文件名列表。 #### 关键注意事项 1. **与反引号``的区别** `$()`是**现代Shell推荐**的语法,支持嵌套且可读性更好。例如: ```bash # 反引号写法(旧式) result=`echo \`ls\`` # $()写法(推荐) result=$(echo $(ls)) ``` 2. **输出中的换行符处理** 默认会保留换行符,若需合并为单行可用双引号包裹: ```bash echo "输出内容: $(ls -l)" # 保留格式 echo "合并内容: "$(ls -l) # 自动去除换行 ``` 3. **错误处理** 若括号内命令执行失败,不会中断脚本,但替换结果为空: ```bash invalid=$(invalid_command) # 变量值为空 ``` #### 与其他语法的对比 | 语法 | 作用 | 示例 | |------------|-----------------------|-----------------------| | `$()` | 命令替换 | `files=$(ls)` | | `${}` | 变量替换/操作 | `${var:-default}` | | `$(( ))` | 算术运算 | `sum=$((1+2))` |
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值