在 getopts 中为已解析的参数启用自动完成
Enable autocomplete for parsed arguments in getopts
我有一个 bash 脚本,它使用 getopts
来解析命令行参数。其中一个参数 -l <name>
指向确定某些设置的 if
语句。是否可以在命令行中输入 <name>
参数自动完成工作?
这是我脚本的命令行解析部分(getopts
):
while getopts 'l:r:m:?h' c
do
case $c in
l)
library=$OPTARG
;;
r)
rename_config=$OPTARG
;;
m)
align_mm=$OPTARG
;;
h|?) usage
;;
esac
done
库选项(-l
)指的是这部分脚本:
if [ $library = "bassik" ];
then
read_mod="clip"
clip_seq="GTTTAAGAGCTAAGCTGGAAACAGCATAGCAA"
echo "Bassik library selected"
elif [ $library = "moffat_tko1" ];
then
read_mod="trim"
sg_length=20
echo "Moffat TKO1 library selected"
elif [ $library = "sabatini" ];
then
read_mod="trim"
sg_length=20
echo "Sabatini library selected"
fi
自动补全应该起作用的部分是“bassik”、“moffat_tko1”和“sabatini”参数。
到目前为止,我尝试过在 ./script.sh -l
之后立即点击 <TAB>
,但这不起作用。我用谷歌搜索了它,但找不到适合我情况的任何东西(也不知道如何称呼它,bash 的新手)。
首先,我将您的脚本片段复制到名为 auto.sh 的文件中,并为其设置了执行权限:
#!/bin/bash
while getopts 'l:r:m:?h' c
do
case $c in
l)
library=$OPTARG
;;
r)
rename_config=$OPTARG
;;
m)
align_mm=$OPTARG
;;
h|?) usage
;;
esac
done
if [ $library = "bassik" ];
then
read_mod="clip"
clip_seq="GTTTAAGAGCTAAGCTGGAAACAGCATAGCAA"
echo "Bassik library selected"
elif [ $library = "moffat_tko1" ];
then
read_mod="trim"
sg_length=20
echo "Moffat TKO1 library selected"
elif [ $library = "sabatini" ];
then
read_mod="trim"
sg_length=20
echo "Sabatini library selected"
fi
然后,要为 -l
选项设置自动完成,您可以从这些基本步骤开始(这可以在未来增强):
1.创建一个包含libs函数的完成脚本(例如./auto-complete.sh)在完成请求时调用(complete 命令的 -F
参数)。如果 -l
选项是完成位置(</code> 参数)之前的单词,该函数将触发库名称的显示(<em>COMPREPLY</em> 数组变量的内容):</p>
<pre><code>function libs()
{
# is the name of the command
# is the word being completed
# is the word preceding the word being completed
case in
-l) COMPREPLY+=("bassi")
COMPREPLY+=("moffat_tko1")
COMPREPLY+=("sabatini");;
esac
}
complete -F libs auto.sh
2. 在本地获取脚本 shell:
$ source ./auto-complete.sh
3. 启动 shell 脚本并在 -l
选项后面的 space 后键入 TAB
键两次:
$ ./auto.sh -l <tab><tab>
bassik moffat_tko1 sabatini
$ ./auto.sh -l bassik
Bassik library selected
4. 上面系统地列出了键入TAB
键时的所有选项。为了在输入第一个字母时更准确地完成,可以增强完成脚本以使用 compgen 命令:
function libs()
{
# is the name of the command
# is the word being completed
# is the word preceding the word being completed
case in
-l) COMPREPLY=($(compgen -W "bassik moffat_tko1 sabatini" "${COMP_WORDS[$COMP_CWORD]}"));;
esac
}
complete -F libs auto.sh
我有一个 bash 脚本,它使用 getopts
来解析命令行参数。其中一个参数 -l <name>
指向确定某些设置的 if
语句。是否可以在命令行中输入 <name>
参数自动完成工作?
这是我脚本的命令行解析部分(getopts
):
while getopts 'l:r:m:?h' c
do
case $c in
l)
library=$OPTARG
;;
r)
rename_config=$OPTARG
;;
m)
align_mm=$OPTARG
;;
h|?) usage
;;
esac
done
库选项(-l
)指的是这部分脚本:
if [ $library = "bassik" ];
then
read_mod="clip"
clip_seq="GTTTAAGAGCTAAGCTGGAAACAGCATAGCAA"
echo "Bassik library selected"
elif [ $library = "moffat_tko1" ];
then
read_mod="trim"
sg_length=20
echo "Moffat TKO1 library selected"
elif [ $library = "sabatini" ];
then
read_mod="trim"
sg_length=20
echo "Sabatini library selected"
fi
自动补全应该起作用的部分是“bassik”、“moffat_tko1”和“sabatini”参数。
到目前为止,我尝试过在 ./script.sh -l
之后立即点击 <TAB>
,但这不起作用。我用谷歌搜索了它,但找不到适合我情况的任何东西(也不知道如何称呼它,bash 的新手)。
首先,我将您的脚本片段复制到名为 auto.sh 的文件中,并为其设置了执行权限:
#!/bin/bash
while getopts 'l:r:m:?h' c
do
case $c in
l)
library=$OPTARG
;;
r)
rename_config=$OPTARG
;;
m)
align_mm=$OPTARG
;;
h|?) usage
;;
esac
done
if [ $library = "bassik" ];
then
read_mod="clip"
clip_seq="GTTTAAGAGCTAAGCTGGAAACAGCATAGCAA"
echo "Bassik library selected"
elif [ $library = "moffat_tko1" ];
then
read_mod="trim"
sg_length=20
echo "Moffat TKO1 library selected"
elif [ $library = "sabatini" ];
then
read_mod="trim"
sg_length=20
echo "Sabatini library selected"
fi
然后,要为 -l
选项设置自动完成,您可以从这些基本步骤开始(这可以在未来增强):
1.创建一个包含libs函数的完成脚本(例如./auto-complete.sh)在完成请求时调用(complete 命令的 -F
参数)。如果 -l
选项是完成位置(</code> 参数)之前的单词,该函数将触发库名称的显示(<em>COMPREPLY</em> 数组变量的内容):</p>
<pre><code>function libs()
{
# is the name of the command
# is the word being completed
# is the word preceding the word being completed
case in
-l) COMPREPLY+=("bassi")
COMPREPLY+=("moffat_tko1")
COMPREPLY+=("sabatini");;
esac
}
complete -F libs auto.sh
2. 在本地获取脚本 shell:
$ source ./auto-complete.sh
3. 启动 shell 脚本并在 -l
选项后面的 space 后键入 TAB
键两次:
$ ./auto.sh -l <tab><tab>
bassik moffat_tko1 sabatini
$ ./auto.sh -l bassik
Bassik library selected
4. 上面系统地列出了键入TAB
键时的所有选项。为了在输入第一个字母时更准确地完成,可以增强完成脚本以使用 compgen 命令:
function libs()
{
# is the name of the command
# is the word being completed
# is the word preceding the word being completed
case in
-l) COMPREPLY=($(compgen -W "bassik moffat_tko1 sabatini" "${COMP_WORDS[$COMP_CWORD]}"));;
esac
}
complete -F libs auto.sh