bash - bash 脚本中的自动完成文件名

标签 bash

我正在尝试模仿 bash 文件补全。
假设我有以下文件:

test1
测试2

输入字符串“te”我想得到输出“test

这是我目前的尝试($c 是输入字符串):

l=1
q="$c"
for j in $(ls -A | grep "^$c"); do
    if [ "${j/$c}" != "$j" ]; then 
            n=$(ls -A | grep ^$j | wc -l)
            if [ $n -gt $l ]; then 
                    q="$j"  
            fi      
    fi
done
c="$q"
echo $c

感谢您的帮助

最佳答案

我倾向于认为没有办法从完成引擎中获取它,因为它不是 GNU Bash 的一部分,而是 Readline。但至少我们可以使用 compgen 获得可能完成的列表。并且找到最长公共(public)前缀的实现应该不是问题。所以……

#!/bin/bash

SCRIPTNAME="${0##*/}"
USAGE="Usage: $SCRIPTNAME <prefix>

Print common prefix of possible file name completions. Like <TAB> but to
stdout."

(( $# == 1 )) || { printf >&2 '%s\n' "$USAGE"; exit 1; }

PREFIX="$1"

commonprefix() {
    (( $# >= 2 )) || { 
        echo "$1"
        return 0
    }
    local -i i N M
    for ((i=0; i<=${#1}; i++)); do 
        for ((N=1; N<=$#-1; N++)); do
            let M=$N+1
            [[ ${!N:i:1} == ${!M:i:1} ]] || break 2
        done
    done
    echo "${1:0:i}"
}

readarray -t COMPLETIONS < <(compgen -f "$PREFIX")
commonprefix "${COMPLETIONS[@]}"

关于bash - bash 脚本中的自动完成文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20827951/

相关文章:

bash - 如何在 bash 脚本中 scp 所有文件(或选择文件)

linux - 运行 packer build 时补丁变空。如何解决这个问题

linux - 如何缩进文件+bash中的行

c - 奇怪的内存行为处理 TSV

linux - 使用分隔符拆分字符串

iphone - 修改 xcode 字符串文件 post Archive : Converting Binary to UTF-8

linux - 在 Makefile 中使用 xargs basename

bash - 在后台 BASH 上运行 Matlab

bash - gnu parallel 并行化一个for循环

linux - 如何正确地将文件的一行读入数组?