Bash:read+;完成
我是bash新手,我正在尝试编写一个bash脚本来保存用户的输入(一些标记),为了帮助这个用户,我希望只允许基于我个人的预定义标记列表完成,而不允许基于公共选项卡文件完成(文件夹中的文件名) 我希望在Bash:read+;完成,bash,Bash,我是bash新手,我正在尝试编写一个bash脚本来保存用户的输入(一些标记),为了帮助这个用户,我希望只允许基于我个人的预定义标记列表完成,而不允许基于公共选项卡文件完成(文件夹中的文件名) 我希望在读取输入过程中,用户可以按选项卡以使用预定义标记列表完成is word。我认为这是一个常见的问题和方法,但我没有找到一个好的方法。我发现一些帖子对我来说有点太复杂了,它们似乎解释了这不是一个简单的问题。我甚至不知道这是否可能 你有什么想法吗?或者有一种完全不同的方法?谢谢您的帮助。在第二部分中,
读取
输入过程中,用户可以按选项卡
以使用预定义标记列表完成is word。我认为这是一个常见的问题和方法,但我没有找到一个好的方法。我发现一些帖子对我来说有点太复杂了,它们似乎解释了这不是一个简单的问题。我甚至不知道这是否可能
你有什么想法吗?或者有一种完全不同的方法?谢谢您的帮助。在第二部分中,有一个简单的版本 请尝试此测试版本:
#!/bin/bash --
reade () {
tmpdir=$(date "+/tmp/%Y%m%d%H%M%S$$")
mkdir "${tmpdir}"
for ptag in "${predefinedtags[@]}" ; do
touch "${tmpdir}"/"${ptag}"
done
readetags=$(cd "${tmpdir}" || printf "internal error" ; read -re usertags ; printf "%s" "${usertags}")
rm -rf "${tmpdir}" 2>/dev/null >/dev/null
eval "${1}"=\"\$\{readetags\}\"
}
predefinedtags=(one two three four five)
printf "enter tags (separate multiple values by space)\n"
reade tags
printf "%s\n" "${tags}"
这可能会被认为是奇怪的,但它是有趣的!(并使用shellcheck进行检查)
它定义了一个新的reade函数,该函数创建一个具有唯一名称的临时目录,并为预定义标记中的每个元素创建一个空文件。它将当前目录更改为新的临时目录,并运行read-e
选项卡
键将按预期工作
最后,用户输入的标签都分配给标签
注意不要将带有空格或特殊字符的标记插入预定义的标记中,如“,”(等)
----
第二部分
您可能希望定义一个已包含空文件(预定义的标记)的配置目录,而不是创建和删除临时目录
在下面的脚本中将/path/to/configuration
替换为配置
目录的真实路径名:
#!/bin/bash --
printf "enter tags (separate multiple values by space)\n"
tags=$(cd /path/to/configuration || printf "internal error" ; read -re usertags ; printf "%s" "${usertags}")
printf "%s\n" "${tags}"
测试(其中写入TAB键):
这可能有点棘手,因为第一个单词是作为命令完成的,而下面的单词是作为该命令的参数完成的。您可以将每个标记配置为一个命令,该命令将任何标记作为参数,但我不确定如何防止第一个单词以除其中一个标记以外的任何形式完成。您好谢谢你的回答,我考虑过这种解决方案,我喜欢你这样做。这对我来说可能是一个非常好的临时和有效的解决方案,而不是基于我的数组的“真正”完成。我必须找到用空格管理标记的方法,因为我需要用多词标记(作者、标题等)来完成。感谢您提供此解决方案。如果有人对基于阵列的完成有更多了解,请随时在此处撰写信息。
#!/bin/bash --
printf "enter tags (separate multiple values by space)\n"
tags=$(cd /path/to/configuration || printf "internal error" ; read -re usertags ; printf "%s" "${usertags}")
printf "%s\n" "${tags}"
$ ls configuration/
five four one three two
$ ./script.sh
enter tags (separate multiple values by space)
TAB
five four one three two
five ten
five ten
$ touch configuration/cat
$ ls configuration/
cat five four one three two
$ ./script.sh
enter tags (separate multiple values by space)
TAB
cat five four one three two
cat hello
cat hello