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