Function 在函数调用中保留参数

Function 在函数调用中保留参数,function,shell,scripting,arguments,ksh,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 { prin

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

#!/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
看起来我在备份参数时丢失了原始参数。
脚本
一些脚本
应该得到3个参数
1
2 3 4
5
,但得到5


有什么方法可以保留原始参数吗?

在经典的
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\u args
可以替换当前正在执行的破坏数组的任何操作,当该函数返回并在foo3中继续处理时,它将被替换。

为什么不能调用
foo2“$@”
foo1“$@”
?如果需要保留参数数组,则需要使用数组而不是字符串。
set*
将展平参数列表。我的意思是,如果使用单个参数
foo bar
调用函数,那么在调用
set*
之后,
$1
不是
foo bar
$1
将是
foo
,而
$2
将是
bar