Bash 使用for循环模拟select语句在添加颜色时输出不均匀的列
我有一个超过100个元素的数组。我需要一个菜单来列出这些元素,然后我需要选择其中一个元素,以便在脚本中进一步使用。很简单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/
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"