Bash嵌套的私有函数

时间:2018-11-13 21:36:10

标签: bash

我正在尝试创建自定义Mac Terminal命令start,在Terminal中,我的目的是编写$ start func1 subfunc myText,其中func是start.sh文件中的一个函数, subfunc仅在func中是一个函数,只能从func中调用。因此$ start subfunc myText是不可能的。我看到可以从另一个(Here)传递函数,但前提是两者都在start.sh文件的外部范围内。

基本上:

start.sh:

function func(){
  function subfunc(){
    echo $1
  }
}

,然后在终端中: $ start func subfunc Hey打印嘿

2 个答案:

答案 0 :(得分:2)

您需要调用函数,而不仅要声明它们:

func() {
   subfunc() {
      echo "$1"
   }
   "$@"
}
"$@"

但是函数没有作用域,因此一旦在另一个函数中声明该函数,它将覆盖先前的声明。因此,我建议这样做,使每个功能和子功能的名称唯一。

f() {
  f() {
    echo in
  }
  echo out
}

f // will print 'out'
f // will print 'in'

请注意,可以使用function name() {},但不能使用not really valid。使用name() { },因为posix未指定function name {}

答案 1 :(得分:2)

您不需要为此嵌套函数。我认为这是一个参数解析问题:

#!/bin/bash

start() {
    case $1 in 
        func) shift; do_func "$@" ;;
        *) echo "unknown subcommand"; exit 1 ;;
    esac
}

do_func() {
    case $1 in
        subfunc) shift; do_subfunc "$@" ;;
        *) echo "unknown sub-subcommand"; exit 1 ;;
    esac
}

do_subfunc() {
    echo "$1"
}

start "$@"

然后

$ ./start func foo
unknown sub-subcommand
$ ./start func subfunc 'hello world'
hello world