我的更简单的 shell 片段与原始片段相同吗?

Lin*_*eak 0 shell posix brace-expansion

我正在对我的 POSIX shell 代码进行年度审查。

我可能发现了一个奇怪的行,我以前并不了解它:

原来的

[ $# -eq 3 ] && exit_code=$3 || exit_code=1
Run Code Online (Sandbox Code Playgroud)

新代码 - 更简单

exit_code=${3:-1}
Run Code Online (Sandbox Code Playgroud)

这两种方法在提供结果方面是否完全相同?

请详细说明是否有任何区别?

Dop*_*oti 7

这两种方法似乎使用不同的逻辑:

[ $# -eq 3 ] && exit_code=$3 || exit_code=1
Run Code Online (Sandbox Code Playgroud)

这将,当且仅当,位置参数 ( $#)的数量正好等于三个时,将exit_code变量设置为等于第三个位置参数的值;否则应设置为等于1

exit_code=${3:-1}
Run Code Online (Sandbox Code Playgroud)

这将设置exit_code于第三位置参数(或到的值1而不管是否存在如果不设置它)多于3个位置参数。


总结一下:exit_code如果位置参数的数量不是正好三个,则第一个将设置为 1;第二个与位置参数的数量无关。