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
相关产品推荐
相关产品推荐

