簡體   English   中英

Bash嵌套的私有函數

[英]Bash Nested Private Functions

我試圖創建一個自定義的Mac Terminal命令, start ,在Terminal中,我的意圖是編寫$ start func1 subfunc myText ,其中func是start.sh文件中的一個函數, subfunc僅是在func中的一個函數,只能從funcfunc 因此$ start subfunc myText是不可能的。 我看到有可能從另一個函數( 這里 )傳遞一個函數,但前提是兩者都在start.sh文件的外部范圍內。

基本上:

start.sh:

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

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

您需要調用函數,而不僅僅是聲明它們:

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

但是函數沒有作用域,因此一旦在另一個函數中聲明該函數,它將覆蓋之前的聲明。 因此,我建議這樣使每個功能和子功能名稱唯一。

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

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

請注意,使用function name() {}是可以接受的,但並非真正有效 使用name() { } ,因為posix未指定function name {}

您不需要為此的嵌套函數。 我認為這是一個參數解析問題:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM