Bash 使用for循环模拟select语句在添加颜色时输出不均匀的列

Bash 使用for循环模拟select语句在添加颜色时输出不均匀的列,bash,for-loop,colors,multiple-columns,Bash,For Loop,Colors,Multiple Columns,我有一个超过100个元素的数组。我需要一个菜单来列出这些元素,然后我需要选择其中一个元素,以便在脚本中进一步使用。很简单 select opt in "${menu[@]}"; do case $REPLY in [0-9]*) # do stuff with $opt esac done 但据我所知,除了$COLULMN宽度之外,似乎没有办法定制选择输出菜单的方式。所以我想我应该使用for循环来模拟选择,并给菜单添加一点颜色 #!/usr/local/bin/

我有一个超过100个元素的数组。我需要一个菜单来列出这些元素,然后我需要选择其中一个元素,以便在脚本中进一步使用。很简单

select opt in "${menu[@]}"; do
    case $REPLY in
        [0-9]*) # do stuff with $opt
    esac
done
但据我所知,除了
$COLULMN
宽度之外,似乎没有办法定制
选择
输出菜单的方式。所以我想我应该使用
for
循环来模拟
选择
,并给菜单添加一点颜色

#!/usr/local/bin/bash

bold(){
    printf '%b' "\033[38;1m$@\033[0m"
}

mapfile -t options < <(gshuf -n50 /usr/share/dict/words)
n=${#options[@]}
i=0

until [[ $i -eq $n ]]; do
    for opt in "${options[@]}"; do
        i=$((i+1))
        bold "$i) "
        echo "$opt"
    done
done | column
这就是颜色的效果

1) sowt  40) priorate           79) Arakanese
2) pachysomia           41) poudrette           80) mesenchyma
3) somnivolency         42) magnifice           81) deconsideration
4) gargoyle             43) cautionry           82) meliorable

有人能告诉我为什么会发生这种情况吗?有没有一种方法可以在不破坏列/格式等的情况下简单地给编号列表的编号上色?是否可以使用
选择
执行此操作?那将是理想的

似乎
命令不知道转义序列在输出中不占空间,但您可以使用
sed
命令后添加序列,例如:

shuf -n 50 /usr/share/dict/words \
 | nl -nln -s") " -w1 \
 | column \
 | sed "s/[0-9]\+/$(tput bold)&$(tput sgr0)/g"
或:


可能
不知道特殊字符\033等。只需更改颜色并将其计为可显示字符。谢谢!我不得不稍微调整一下以正确显示输出:
gshuf-n200/usr/share/dict/words | nl-nln-s”)“-w3 | sed-E's/[]+/)/g'| column-c$COLUMNS | gsed“s/[0-9]\+/$(tput粗体)和$(tput sgr0)/g”
。但这很有效。再次感谢!
shuf -n 50 /usr/share/dict/words \
 | nl -nln -s") " -w1 \
 | column \
 | sed "s/[0-9]\+/$(tput bold)&$(tput sgr0)/g"
shuf -n 50 /usr/share/dict/words \
 | nl -nln -s") " -w1 \
 | column -c $COLUMNS \
 | sed "s/[0-9]\+/$(tput bold)&$(tput sgr0)/g"