如何让脚本使用“$@”或默认参数列表,同时不使用空格破坏路径?

如何让脚本使用“$@”或默认参数列表,同时不使用空格破坏路径?

我想要一个脚本,如果没有参数传递给它,它将在某些默认路径上运行另一个实用程序;理想情况下,我希望对于包含空格的路径来说这是安全的。

到目前为止我有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 等)。

相关内容