我正在尝试创建自定义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
打印嘿
答案 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