如何在命令行中运行脚本函数?
- 2024-10-25 08:42:00
- admin 原创
- 63
问题描述:
我有一个具有一些功能的脚本。
我可以直接从命令行运行其中一个函数吗?
像这样吗?
myScript.sh func()
解决方案 1:
好吧,虽然其他答案都是正确的 - 但你当然可以做其他事情:如果你有权访问 bash 脚本,你可以修改它,并简单地在末尾放置特殊参数"$@"
- 它将扩展到你指定的命令行的参数,并且由于它是“单独的”,shell 将尝试逐字调用它们;在这里你可以将函数名称指定为第一个参数。示例:
$ cat test.sh
testA() {
echo "TEST A $1";
}
testB() {
echo "TEST B $2";
}
"$@"
$ bash test.sh
$ bash test.sh testA
TEST A
$ bash test.sh testA arg1 arg2
TEST A arg1
$ bash test.sh testB arg1 arg2
TEST B arg2
为了完善,您可以首先验证该命令是否存在并且是一个函数:
# Check if the function exists (bash specific)
if declare -f "$1" > /dev/null
then
# call arguments verbatim
"$@"
else
# Show a helpful error
echo "'$1' is not a known function name" >&2
exit 1
fi
解决方案 2:
source
如果脚本仅定义函数而不执行其他任何操作,则可以先使用或命令在当前 shell 上下文中执行脚本.
,然后直接调用该函数。help source
有关更多信息,请参阅。
解决方案 3:
以下命令首先在上下文中注册该函数,然后调用它:
. ./myScript.sh && function_name
解决方案 4:
简而言之,没有。
source
您可以使用(了解详情)将脚本中的所有函数导入到您的环境中help source
,然后您就可以调用它们。这也会执行脚本,所以要小心。
无法从 shell 脚本中调用某个函数,就好像它是共享库一样。
解决方案 5:
使用case
#!/bin/bash
fun1 () {
echo "run function1"
[[ "$@" ]] && echo "options: $@"
}
fun2 () {
echo "run function2"
[[ "$@" ]] && echo "options: $@"
}
case $1 in
fun1) "$@"; exit;;
fun2) "$@"; exit;;
esac
fun1
fun2
该脚本将运行函数 fun1 和 fun2,但如果您使用选项 fun1 或 fun2 启动它,它将仅运行带有参数的给定函数(如果提供)并退出。用法
$ ./test
run function1
run function2
$ ./test fun2 a b c
run function2
options: a b c
解决方案 6:
我遇到一种情况,我需要一个来自 bash 脚本的函数,该函数不能在之前执行(例如source
),而问题@$
是 myScript.sh 然后运行两次,似乎...所以我想出了一个用 sed 来获取该函数的想法:
sed -n "/^func ()/,/^}/p" myScript.sh
为了在需要时执行它,我将它放入一个文件中并使用source
:
sed -n "/^func ()/,/^}/p" myScript.sh > func.sh; source func.sh; rm func.sh
解决方案 7:
编辑:警告 - 似乎这并不在所有情况下都有效,但在许多公共脚本上运行良好。
如果您有一个名为“control”的 bash 脚本,并且其中有一个名为“build”的函数:
function build() {
...
}
然后您可以像这样调用它(从它所在的目录):
./control build
如果它在另一个文件夹内,则会出现以下情况:
another_folder/control build
如果您的文件名为“control.sh”,那么该函数将可像这样调用:
./control.sh build
解决方案 8:
解决了帖子,但我想提一下我喜欢的解决方案。即定义一个通用的单行脚本eval_func.sh
:
#!/bin/bash
source $1 && shift && "@a"
然后通过以下方式调用任何脚本中的任何函数:
./eval_func.sh <any script> <any function> <any args>...
我在接受的解决方案中遇到的一个问题是,当在另一个脚本中获取包含函数的脚本时,后者的参数将由前者评估,从而导致错误。
解决方案 9:
这里的其他答案都很好,并且非常感谢,但我通常不想在会话中source
执行脚本(在当前 shell 中读取并执行文件)或直接修改它。
我发现编写一两行“引导”文件并运行它更方便。使测试主脚本更容易,不会对 shell 会话产生副作用,而且作为奖励,您可以加载模拟其他环境进行测试的内容。示例...
# breakfast.sh
make_donuts() {
echo 'donuts!'
}
make_bagels() {
echo 'bagels!'
}
# bootstrap.sh
source 'breakfast.sh'
make_donuts
现在只需运行./bootstrap.sh
。同样的想法也适用于你的python、ruby或任何脚本。
为什么有用?假设你因为某种原因使生活变得复杂,你的脚本可能会处于不同的环境中,并呈现不同的状态。例如,要么是你的终端会话,要么是云提供商的酷炫新产品。你还想使用简单的方法在终端中测试云事物。不用担心,你的引导程序可以为你加载基本状态。
# breakfast.sh
# Now it has to do slightly different things
# depending on where the script lives!
make_donuts() {
if [[ $AWS_ENV_VAR ]]
then
echo '/donuts'
elif [[ $AZURE_ENV_VAR ]]
then
echo 'donuts'
else
echo '/keto_diet'
fi
}
如果你让你的引导程序接受一个参数,那么你可以为你的函数加载不同的状态,仍然只需在 shell 会话中使用一行:
# bootstrap.sh
source 'breakfast.sh'
case $1 in
AWS)
AWS_ENV_VAR="arn::mumbo:jumbo:12345"
;;
AZURE)
AZURE_ENV_VAR="cloud::woo:_impress"
;;
esac
make_donuts # You could use $2 here to name the function you wanna, but careful if evaluating directly.
在终端会话中你只需输入:./bootstrap.sh AWS
结果:
# /donuts
解决方案 10:
您可以像下面这样从命令行参数调用函数
function irfan() {
echo "Irfan khan"
date
hostname
}
function config() {
ifconfig
echo "hey"
}
$1
定义函数后,在末尾添加 $1 以接受要调用的函数参数。假设上述代码保存在 fun.sh 中。现在您可以在命令行中调用 ./fun.sh irfan 和 ./fun.sh config 等函数。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件