HP-UX KSH脚本 - 使用$ @

时间:2018-05-31 18:45:46

标签: unix ksh hp-ux

我遇到了一个问题'使用我在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,因为你必须运行该代码来传递空白参数。我必须在我的脚本中多次重复此代码段,因为我无法找到另一种方式。有吗?

感谢您的任何帮助或指导。

1 个答案:

答案 0 :(得分:0)

以下是我编写函数的方法:

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 parameter