从https://unix.stackexchange.com/a/458074/674
算术扩展也受到 split+glob 的影响,所以也应该被引用 (shift "$((OPTIND - 1))") (这里不是问题,因为你使用的是 bash,它不会从环境继承 $IFS 并且您没有在脚本的前面修改 IFS,但仍然是很好的做法)。
算术扩展与 IFS 有某种关系吗?
答案1
与任何其他算术扩展一样,不带引号的算术扩展的结果会经历文件名通配符(通配符扩展)和单词(字段)分割未加引号的扩展。它非常无用,并且一些 shell 不这样做,但这是历史 shell 所做的(因为它更容易实现),因此这就是 POSIX 标准化的内容。
算术扩展的结果只是一串-
和 数字,因此它永远不能包含通配符。 (一些 shell 具有浮点,还可以包含.
,+
和字母。)由于它不能包含空格,因此通常也不会受到字段分割的影响。然而,字段分割可以通过以下方式进行配置IFS
:字段分隔符是 的字符IFS
。包含数字的情况IFS
极其罕见,而且是一件非常愚蠢的事情,但如果您想编写完全健壮的代码,则需要防止这种情况。如果结果可能为负,这一点就更重要,因为包含破折号IFS
并不那么愚蠢。
POSIX 规定 shellIFS
在启动时必须将其设置为默认值,这样脚本就不会受到IFS
环境中的 值的影响。(导出 并不常见IFS
,但有人可能会这样做。)但是,一些广泛使用的 shell(dash、Busybox sh)会保留IFS
环境中的 值,因此如果强大的 shell 脚本包含任何未加引号的扩展,则应将其明确设置IFS
为默认值(或取消设置,效果相同)。