我可以只从终端调用一个函数而不是整个 bash 脚本吗?

Can I only call a function from the terminal rather the whole bash script?

我有一个 bash 脚本,看起来是这样的:

#!/bin/bash

function one {
    echo "I am function one!!"
}

function two {
    echo "I am function two!!"
}

one
two

如果我简单地做 bash test.sh 两个函数都被执行了。

我想做的是从终端调用脚本,同时指定两个函数之一,并只执行它。 也许是这样的: bash test.sh$one() 它应该只打印出来

I am function one!!

这可能吗?如果可能,我将如何实现它?

谢谢!

=========================

编辑: 根据@Waqas 的建议,我最终实施了以下对我有用的方法:

function main {
    if [ -z "" ]
    then
        some commands
    # else run the given function only
    else
        
    fi
}
main "$@"

谢谢!!!

最好将文件分开:将函数定义移到单独的文件中,比如 ~/lib/testlib.src。你的 test.sh 然后变成

#!/bin/bash
. ~/lib/testlib.src
one
two

如果您需要交互式 shell 中的定义,请手动执行 . ~/lib/testlib.src,或者如果您希望它们始终可用,请将此语句放入您的 ~/.bashrc .

您可以通过在定义函数之后但在任何其他代码行之前编写 case 语句来实现。

#!/bin/bash

function one {
    echo "I am function one!!"
}

function two {
    echo "I am function two!!"
}

case  in
  one)
    one
  ;;
  two)
    two
  ;;
  *)
    one
    two
  ;;
esac

然后可以用作:

$ ./test.sh one
# I am function one!!

$ ./test.sh two
# I am function two!!

在上面的示例中,我将您的脚本主体放在 *) 选项下,但如果它更适合您的需要,您可以改为使用一个)和两个)选项,在调用它们的单个函数后“退出”:

case  in
  one)
    one
    exit 0
  ;;
  two)
    two
    exit 0
  ;;
esac

one
two

这一切都假设您没有向脚本传递任何其他参数,并且 $1 将用于所需的功能。否则 case 语句将变得更加复杂。

有很多方法可以编写代码来满足您的要求。我将为此编写代码的方式如下:

#!/bin/bash
    
function main {
    # If the argument is empty then run both functions else only run provided function as argument .
    [ -z "" ] && { one; two; } ||      
}
        
function one {    
    echo "I am function one!!"    
}
    
function two {    
    echo "I am function two!!"    
}
    
main "$@"

如果您只在不传递参数的情况下执行脚本,那么两个函数都将 运行 而在传递参数的情况下,只有一个函数可以工作。

示例 1(两个函数都将 运行):bash script_name

示例2(只有函数一会运行):bash script_name 一个

示例 3(只有函数二会 运行):bash script_name two