![如何让脚本使用“$@”或默认参数列表,同时不使用空格破坏路径?](https://linux22.com/image/146087/%E5%A6%82%E4%BD%95%E8%AE%A9%E8%84%9A%E6%9C%AC%E4%BD%BF%E7%94%A8%E2%80%9C%24%40%E2%80%9D%E6%88%96%E9%BB%98%E8%AE%A4%E5%8F%82%E6%95%B0%E5%88%97%E8%A1%A8%EF%BC%8C%E5%90%8C%E6%97%B6%E4%B8%8D%E4%BD%BF%E7%94%A8%E7%A9%BA%E6%A0%BC%E7%A0%B4%E5%9D%8F%E8%B7%AF%E5%BE%84%EF%BC%9F.png)
我想要一个脚本,如果没有参数传递给它,它将在某些默认路径上运行另一个实用程序;理想情况下,我希望对于包含空格的路径来说这是安全的。
到目前为止我有script.sh
:
#!/bin/sh
base=$(dirname "$0")
exec touch "${@:-"$base/aaa" "$base/bbb"}"
如果我将其放入名为“foo bar”的文件夹中并运行它:
foo\ bar/script.sh
我希望它最终应该做:
touch foo\ bar/aaa foo\ bar/bbb
即在脚本所在的目录“foo bar”下创建文件“aaa”和“bbb”。
相反,我得到了错误
touch: 无法触摸 'foo bar/aaa foo bar/bbb': 没有这样的文件或目录
(如果我将参数传递给脚本,它似乎工作正常。大概删除最后一个命令中的外部引号会反转我的情况。)
答案1
看来您无法在 的扩展中设置默认参数${@:-...}
,并且"${@:-"$base/aaa" "$base/bbb"}"
被扩展为单个字符串。
如果您想设置默认参数,您可能需要这样做:
base=$(dirname -- "$0")
# test explicitly for no parameters, and set them.
if [ "$#" -eq 0 ]; then
set -- "$base/aaa" "$base/bbb"
fi
然后,"$@"
神奇的引用参数替换就会有增无减地发生:
touch -- "$@"
答案2
可以在默认扩展中使用多个参数${@-...}
,
像这样:
#!/bin/bash
base=$(dirname "$0")
arr=("$base/aaa" "$base/bbb")
touch "${@:-"${arr[@]}"}"
但仅限于具有数组的 shell(ksh、zsh、bash 等)。