【问题标题】:Preserving arguments in function call在函数调用中保留参数
【发布时间】:2015-06-28 14:34:27
【问题描述】:

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

#!/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 个。

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

【问题讨论】:

  • 为什么不能打电话给foo2 "$@"foo1 "$@"
  • 如果您需要保留参数数组,您需要使用数组而不是字符串。

标签: function shell scripting arguments ksh


【解决方案1】:

在经典的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 中继续处理时,它将被替换。

【讨论】:

  • set * 将展平参数列表。我的意思是,如果使用单个参数foo bar 调用该函数,那么在调用set * 之后,$1 不是foo bar$1 将是foo$2将是bar
猜你喜欢
  • 2022-12-11
  • 2023-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多