You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash中$x、$[x]、${x}的区别及脚本相关疑问

$[] 和 ${} 的核心区别详解

嘿,这个问题问得很实用!咱们先从你给出的测试脚本说起,然后把这两个语法的区别拆解得明明白白:

首先看你的测试脚本:

#!/bin/bash
num1=100
num2=100
if test $num1 -eq $num2 # 使用$num1、$[num1]和${num1}无差异
then
    echo "equal"
else
    echo "not equal"
fi

你提到在echo变量时要用{}界定范围,这其实是${}的基础用法之一,下面分别讲两者的定位和差异:

1. ${}:变量扩展的标准工具

说白了,${}就是用来精准操作变量的语法,核心作用是明确变量名的边界,避免歧义,同时还支持超多高级变量处理功能:

  • 基础用法:当变量名后面紧跟其他字符时,必须用${}来区分。比如你有变量name="Alice",想输出Alice123,如果写$name123,shell会把它当成一个叫name123的变量(大概率不存在,会输出空),而${name}123就会正确输出Alice123。
  • 高级用法:它还能处理默认值、字符串截取、替换等,比如:
    • ${var:-default}:如果var未定义或为空,就用default代替
    • ${var#prefix}:删除变量var开头的prefix字符串
    • ${var/source/target}:把var里的第一个source替换成target
      这些都是日常写shell脚本高频用到的功能。

2. $[]:老式整数算术运算语法

$[]是bash里专门用来做整数算术计算的语法,它会把括号里的内容当成整数表达式求值,返回计算结果。比如:

  • echo $[10 + 5]会输出15
  • 如果num1=100,echo $[num1 * 2]会输出200

不过要注意,这是比较老旧的语法,现在更推荐用$(( )),因为它是POSIX标准的,兼容性更好,写法也更灵活,比如$((num1 + num2))和$[num1 + num2]效果一样,但$(( ))支持更多写法,比如$((++num1))这种自增操作。

为什么你的脚本里用三者看起来无差异?

在你的测试脚本里,$num1、$[num1]、${num1}都能拿到100,是因为num1的值是纯整数,$[num1]会把这个整数当成算术表达式计算,结果还是100,所以和直接取变量值的效果一致。但如果变量是字符串或者表达式,区别就立刻显现了:
比如:

num1="10+5"
echo $num1    # 输出字符串 "10+5"
echo ${num1}  # 同样输出字符串 "10+5"
echo $[num1]  # 计算表达式,输出 15

总结一下:

  • ${}是变量操作的核心,用来处理变量的取值、修改等
  • $[]是算术计算工具,用来做整数运算
  • 只有当变量值是纯整数时,两者在取值场景下才会看起来效果一样,但本质完全不同

内容的提问来源于stack exchange,提问作者1243916142

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:24:37