我似乎记得在这个网站上的评论中,算术展开式的内容可能分词了,但我再也找不到评论了。
考虑以下代码:
printf '%d\n' "$(($(sed -n '/my regex/{=;q;}' myfile)-1))"
如果sed
命令输出多位数且$IFS
包含数字,则命令替换会在算术发生之前进行分词吗?
(我已经使用额外的双引号进行了测试:
printf '%d\n' "$(("$(sed -n '/my regex/{=;q;}' myfile)"-1))"
但这是行不通的。)
顺便说一句,上面的示例代码是简化为最简单形式的更改这个功能我刚刚发布在 Stack Overflow 上。
答案1
不,事实并非如此。
在$((expression))
,表达被视为在双引号中,如POSIX 指定。
但请注意,命令替换内的表达式仍然受到split+glob
:
$ printf '%d\n' "$(( $(IFS=0; a=10; echo $a) + 1 ))"
2
带双引号:
$ printf '%d\n' "$(( $(IFS=0; a=10; echo "$a") + 1 ))"
11
与其他扩展一样,算术扩展如果不在双引号内,则经历split+glob
:
$ IFS=0
$ echo $((10))
1
答案2
来自 bash 手册(运行LESS=+/'^ *Arithmetic Expansion' man bash
):
算术扩展
表达式中的所有标记都会经历参数扩展、字符串扩展、命令替换和引号删除。
因此,不执行任何拆分。