保留函数调用中的参数

时间:2015-04-21 12:21:47

标签: function shell scripting arguments ksh

我试图弄清楚如何在函数调用链中保留原始参数 例如,考虑以下情况:

#!/usr/bin/ksh

function foo1
{
        print "$#"
        print "$@"
        # Call to some other script which expect 
        # same arguments as foo3
        # ./some_ksh_script "$@"
}

function foo2
{
        print "$#"
        print "$@"
        backup_arg="$@"
        # Process arguments
        foo1 $backup_arg
}

function foo3
{
        print "$#"
        print "$@"
        backup_arg="$@"
        # Process arguments
        foo2 $backup_arg
}

foo3 "$@"

输出 -

vikram@vikram-VirtualBox ~ $ ./test.sh 1 "2 3 4" 5
3
1 2 3 4 5
5
1 2 3 4 5
5
1 2 3 4 5

看起来我在备份参数时丢失了原始参数 脚本some_ksh_script应获得3个参数12 3 45,但获得5个。

我有什么方法可以保留原始论点吗?

1 个答案:

答案 0 :(得分:0)

在经典sh中,只有一个数组(由set设置或作为参数传递,并使用$1$2等编制索引。如果你需要操纵参数,它们就会被销毁,但是破坏是本地的。所以也许你想要这样的东西:

!/bin/sh 


foo1() {
  echo foo1 passed $# args
}

foo2() {
  echo foo2 passed $# args
}

process_args() {
  func=$1
  shift
  set $*  # Flatten the arg list
  args=$*
  $func $args
}

foo3() {
  echo foo3 passed $# args
  process_args foo2 "$@"
  echo foo3 still has $# args
  process_args foo1 "$@"
}

foo3 "$@"

在这里,您需要使用参数"$@"直接从foo3调用foo2。关键是process_args可以替换当前正在执行的任何破坏数组的操作,当该函数返回并在foo3中继续处理时,它将被替换。