0
` \$ bang() ( IFS=\*; let N=\$1-1 k="\$*" && bang \$N \$k || echo \${2-1} )`

#### Explanation

A recursive function that leverages the arithmetic expansions evaluated by the `let` command, and the significance of the field separator when arguments are expanded using `"\$*"`.

• `IFS=\*` concatenates the arguments `"\$*"` using a `*` symbol, which `let` interprets as a multiplication operator;

• `let N=\$1-1 k="\$*"` assigns arithmetic values to variables `N` and `k`. `N` will have a value one less than the first argument; `k` will be the product of all the arguments;

• `&&` performs the command immediately to its right iff the expression immediately to its left evaluates to `true`;

• `bang \$N \$k` calls itself with the first argument being one less than it was, and the second argument being the cumulative product of the arguments thus far across all iterations;

• `||` performs the command immediately to its right iff the command immediately to its left wasn't performed;

• `echo \${2-1}` prints the second argument, which—if there is one—will be the factorial, otherwise it prints `1`.

#### Limitations

If a positive integer is not the one and only argument passed to it when invoked by the user, the result will be nonsense or an error will be thrown.