这样做的常用方法是将参数分配给函数中的局部变量,即:
copy() {
local from=${1}
local to=${2}
# ...
}
另一种解决方案可能是getopt -style 选项解析。
copy() {
local arg from to
while getopts 'f:t:' arg
do
case ${arg} in
f) from=${OPTARG};;
t) to=${OPTARG};;
*) return 1 # illegal option
esac
done
}
copy -f /tmp/a -t /tmp/b
可悲的是,bash 无法处理更易读的长选项,即:
copy --from /tmp/a --to /tmp/b
为此,您需要使用外部getopt
程序(我认为它仅在 GNU 系统上具有长选项支持)或手动实现长选项解析器,即:
copy() {
local from to
while [[ ${1} ]]; do
case "${1}" in
--from)
from=${2}
shift
;;
--to)
to=${2}
shift
;;
*)
echo "Unknown parameter: ${1}" >&2
return 1
esac
if ! shift; then
echo 'Missing parameter argument.' >&2
return 1
fi
done
}
copy --from /tmp/a --to /tmp/b
另请参阅:在 bash shell 脚本中使用 getopts 获取长短命令行选项
您也可以偷懒,只需将“变量”作为参数传递给函数,即:
copy() {
local "${@}"
# ...
}
copy from=/tmp/a to=/tmp/b
并且您将在函数中拥有${from}
和${to}
作为局部变量。
请注意,与以下相同的问题也适用——如果未传递特定变量,它将从父环境继承。您可能需要添加一条“安全线”,例如:
copy() {
local from to # reset first
local "${@}"
# ...
}
以确保${from}
并且${to}
在未通过时将被取消设置。
如果您对某些非常糟糕的事情感兴趣,您还可以在调用函数时将参数分配为全局变量,即:
from=/tmp/a to=/tmp/b copy
然后你可以在函数中使用${from}
and 。请注意,您应该始终传递所有参数。否则,随机变量可能会泄漏到函数中。${to}
copy()
from= to=/tmp/b copy # safe
to=/tmp/b copy # unsafe: ${from} may be declared elsewhere
如果你有 bash 4.1(我认为),你也可以尝试使用关联数组。它将允许您传递命名参数,但它会很丑陋。就像是:
args=( [from]=/tmp/a [to]=/tmp/b )
copy args
然后在 中copy()
,您需要获取数组。