【发布时间】:2018-11-10 20:29:49
【问题描述】:
我在 HP-UX KSH 中开发的脚本存在“问题”。该脚本包含许多函数,我需要在它们之间传递相同的一组参数。一切都很好,但有些参数可能是空白的。使用双双引号 ("") 很容易传递空白参数,但是如果我想使用 ${@} 将一组完整的参数从一个函数传递到另一个函数怎么办,包括空白?为了让事情变得棘手,每次可以有可变数量的参数,所以方法必须是动态的。
示例:我有一个名为 test1 的函数,它接受多个参数。其中任何一个都可以为空。我还创建了一个名为 test2 的函数,其中传递了 test1 的所有参数:
test1()
{
echo 1-1: ${1}
echo 1-2: ${2}
test2 ${@}
}
test2()
{
echo 2-1: ${1}
echo 2-2: ${2}
}
# test1 "" hello
1-1:
1-2: hello
2-1: hello
2-2:
问题是,如果 ${1} 为空,则来自 test1 的 ${2} 在 test2 中显示为 ${1}。所以为了解决这个问题,我创建了这个代码,它有效地创建了一个函数字符串,所有参数都用双引号括起来:
test1()
{
typeset var FUNC="test2"
typeset -i var COUNT=1
echo 1-1: ${1}
echo 1-2: ${2}
while [ ${COUNT} -le ${#@} ]; do
typeset var PARAM=$(eval "echo \$${COUNT}")
FUNC="${FUNC} \"${PARAM}\""
((COUNT=COUNT+1))
done
eval "${FUNC}"
}
# test1 "" hello
1-1:
1-2: hello
2-1:
2-2: hello
这很好用,谢谢。现在是我的“问题”。
真的可以将上面的代码封装在一个自己的函数中吗?对我来说,这似乎是一个问题 22,因为您必须运行该代码才能传递空白参数。我必须在我的脚本中多次重复这段代码 sn-p 因为我找不到其他方法。有吗?
我们将不胜感激地收到任何帮助或指导。
【问题讨论】:
-
双引号!使用
"$@",而不是${@}。有点自吹自擂,见stackoverflow.com/q/12314451/7552。另见Security implications of forgetting to quote a variable in bash/POSIX shells -
天哪,真的那么简单吗?嗬!谢谢。
-
其实我还是得用代码,因为我用eval调用了另一个函数,即使用“$@”也不能解析空白参数。所以我仍然需要循环,但只在一个位置,所以它仍然是一个很好的结果。谢谢!
-
你不应该在任何地方使用 eval。引用您的变量,这应该可以解决它。请参阅此页面以帮助您删除 eval:I'm trying to put a command in a variable, but the complex cases always fail!
-
谢谢。我知道你从哪里来。也许我想多了这个问题。在我的第二个示例中,我可以将 eval "${FUNC}" 简化为简单的 "${FUNC}" "${@}"