我有一个‘问题’的脚本,我正在开发的惠普-UX。脚本包含许多函数,我需要在它们之间传递相同的参数集。一切都很好,但有些参数可以是空白的。使用双引号("")很容易传递空白参数,但是如果我想使用${@} (包括空格)将一组完整的参数从一个函数传递到另一个函数,又会怎样呢?为了使事情变得棘手,每次都可以有一个可变的参数数,所以这个方法必须是动态的。
示例:我有一个名为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这个很好,谢谢。现在轮到我的问题了。
实际上,是否有可能将上述代码封装在自己的函数中?在我看来,这似乎是一个陷阱,因为您必须运行该代码才能传递空白参数。我不得不在我的脚本中多次重复这个代码片段,因为我找不到其他方法了。有一个吗?
任何帮助或指导都将受到感激。
发布于 2018-06-01 14:58:37
下面是我将如何编写您的函数:
show_params() {
typeset funcname=$1
typeset -i n=0
shift
for arg; do
((n++))
printf "%s:%d >%s<\n" "$funcname" $n "$arg"
done
}
test1() { show_params "${.sh.fun}" "$@"; test2 "$@"; }
test2() { show_params "${.sh.fun}" "$@"; }
test1 "" 'a string "with double quotes" in it'test1:1 ><
test1:2 >a string "with double quotes" in it<
test2:1 ><
test2:2 >a string "with double quotes" in it<使用test1的定义(它构建了一个包含命令的字符串),在所有参数周围添加双引号,然后对字符串进行评估,我得到了这个结果。
$ test1 "" 'a string "with double quotes" in it'
1-1:
1-2: a string "with double quotes" in it
test2:1 ><
test2:2 >a string with<
test2:3 >double<
test2:4 >quotes in it<那是因为你要这么做
eval "test2 \"\" \"a string \"with double quotes\" in it\""
# ......... A A A B B A
# A = injected quotes
# B = pre-existing quotes contained in the parameterhttps://stackoverflow.com/questions/50630859
复制相似问题