我有很长的 bash 脚本,要求像命令行一样执行脚本。如果我执行
./script.sh arg1 arg2 create
如上所述,如果我传递字符串“create”以及“arg1”和“arg2”应该执行 script.sh 的特定函数(如 create_fn() )
像上面一样
./script.sh arg1 add
如果我传递字符串“add”以及仅 arg1 --> 应该执行 create_add() 函数。
另外,如果我在“cr”后按 Tab 应该自动写入“创建”/广告 -> 添加
有人能帮我一下吗
答案1
首先,欢迎来到本网站。
您问题的答案取决于传递给脚本的参数的一致性。
如果可以保证
- 仅当总共三个参数时才使用参数“create”,其中“arg1”和“arg2”位于“create”之前,类似地
- 仅当总共有两个参数时才使用参数“add”,其中“arg1”位于“add”之前
然后您可以if
在脚本内对内置变量进行操作,$#
该变量包含调用脚本的参数总数:
#!/bin/bash
if [[ "$#" == "3" && "$3" == "create" ]]
then
create_fn <possible arguments here>
elif [[ "$#" == "2" && "$2" == "add" ]]
then
create_add <possible arguments here>
fi
解释一下:在if
测试中我们检查参数 ( ) 的数量是否$#
为 3和第三个参数 ( $3
) 是“创建”,然后调用create_fn
(可能带有参数;您没有指定问题中是否需要任何参数);或者如果数量或参数为 2 并且第二个参数为“add”,在这种情况下我们调用create_add
.
另一方面,如果命令行参数的顺序是任意的,则您将必须实现更智能的参数处理例程,例如获取选择会是你的朋友。
有关 shell 编程的更多信息,请查看高级 Bash 脚本编写指南。
关于第二部分您的问题:您正在寻找的功能称为“bash 完成”,这并不是一件小事,特别是因为您想要自动完成命令行参数其中可能的值取决于列表中当前键入的参数的位置以及命令行上前面的项目。这是可能的,但并非微不足道(参见例如如何自定义 Bash 命令补全?)。
答案2
我认为你应该稍微改变一下设置并通过getops
.然而,这些必须位于开头并且只能是单个字母。一个例子:
#!/bin/bash
add=no
create=no
while getopts "ca" option ; do
case $option in
a) add=yes ;;
c) create=yes ;;
\?) echo 'Invalid option. Aborted.' ; exit ;;
esac
done
#shift argument numbers so that file1 is $1 etc.
shift $((OPTIND-1))
if [[ "$add" == "yes" ]] ; then
do_add_procedure
elif [[ "$create" == "yes" ]] ; then
do_create_procedure
else
do_neither
fi
根据您执行if
-语句的方式(即将其分成两个语句),您现在甚至可以通过提供两个选项来运行“create”和“add”。但是,bash
-script 参数必须位于命令的开头:
./script.sh -a file1 file2