为何${*// /*}替换命令行参数空格为*失败?两种写法差异原因
为何直接用
${*// /*}在算术表达式中报错,存入中间变量却正常? 我想写一个bash脚本计算所有整数参数的乘积,不想用循环,尝试把参数中的空格替换为*后执行计算,但两种写法结果不同:
#!/bin/bash # product.sh echo $(( ${*// /*} )) # 执行./product.sh 2 3 4时触发语法错误 args=$* echo $(( ${args// /*} )) # 执行./product.sh 2 3 4时输出24
为什么第一种写法报错,第二种却能正常运行?
核心差异在于bash对参数替换的处理逻辑不同:
第一种写法报错的原因:
当你使用${*// /*}时,bash会将替换操作逐个应用到每个位置参数上,而非把所有参数合并成一个字符串后统一替换。
对于输入2 3 4,每个位置参数本身没有空格,所以替换后还是原参数列表2、3、4。代入算术表达式后变成$((2 3 4)),这不符合bash算术表达式的语法(不能用空格直接分隔多个数值),因此触发语法错误。第二种写法正常的原因:
args=$*会将所有位置参数合并为单一字符串,参数间用默认空格分隔,此时args的值是"2 3 4"。
随后${args// /*}是对这个单一字符串进行全局替换,把所有空格替换为*,得到"2*3*4"。代入算术表达式后就是合法的$((2*3*4)),因此能正确计算出乘积24。
内容的提问来源于stack exchange,提问作者sevan
相关产品推荐
相关产品推荐

