変数列のソート

変数列のソート

ダイナミックメニューを用意しました。最後の部分は列をソートすることです。ほとんどの場合、これはうまくいきましたが(理由はわかりません)、最後の部分が正しく整列していませんでした。スクリプトを抽出し、テストデータをここに入れて直接再現しました。

  1. 列の末尾が揃っていません。
  2. タイトルがソートされていません。

助けてくれてありがとう!

#!/bin/bash
#

listpcs=( kast screen test )
dockersets=( apps1 apps2 infra1 infra2 )
stacklist=( stack1 stack2 stack3 stack4 )
stack1=( domoticz dashboard dashticz nodered x y z ttttttttttttttt)
stack2=( mosquitto mysql nginx registry apache phpmyadmin )
stack3=( nextpvr motioneye joomla squeezebox q w r qqqqqqqqqqqqq)
stack4=( portainer unify wireguard watchtower w e t wwwwwwwwww qqqqqqqqq)

mypc=kast
mymnu=installatie
dockerset=kast
composefile=/home/pi/iotmenu/cfg/docker-compose_kast.yml
envfile=/home/pi/iotmenu/cfg/hub_kast.env

 msgcolor=`echo "\033[01;31m"`      # bold red IS DE OUDE gebruikte moet TZT WEG

 msgcolor_red=`echo "\033[01;31m"`  # bold red
 msgcolor_green=`echo "\033[01;32m"`    # bold green
 msgcolor_blue=`echo "\033[01;36m"` # bold blue

 normal=`echo "\033[00;00m"`        # normal white
 menu=`echo "\033[36m"`         # Blue
 number=`echo "\033[33m"`       # yellow

 bgred=`echo "\033[41m"`
 fgred=`echo "\033[31m"`

 t_sp0='%-3s'
 t_sp1='%-16s'
 t_sp2='%32s'
 t_sp3='%4s'
 t_sp4='%12s'
 t_sp5='%-2s'

    #genereer titel
    for j in "${stacklist[@]}" 
        do      
            printf $t_sp0 && printf "${menu}------- RPI-$j ------"  && printf $t_sp3 && printf "${normal}"
        done
        printf "${normal}\n\n"




    #genereer docker items

    maxkolom=${#stacklist[@]}
    maxrijen=9
    declare -A t_mitem
    declare -A h_mitem

    rij=1
    t_stack=0
    shopt -s extglob        #nodig voor t_waarde om | te gebruiken in een string
    t_waarde="@("       #begin waarde , dit moet t worden t_waarde='@(1|2|3|4 xxxxxxx)
    t_waarde2="@("      #begin waarde , dit moet t worden t_waarde='@(10|20|30|40 xxxxxxx)

    for ((rij;rij<=maxrijen;rij++))                         # eerste lus is aantal rijen van 9              
    do 

        kolom=1
        t_stack=0
        for ((kolom;kolom<=maxkolom;kolom++))                   # tweede lus is kolommen, en pak de eerste kolom
            do
                declare -n stack=${stacklist[$kolom-1]}     

                if (( $(bc <<<"$rij == 1 && $kolom > 1") )); then   # check of er 10 per kolom bij moeten als t de eerste rij is en kolom =2 of hoger
                    t_hlp=`expr $kolom - 1` && t_mul=`expr $t_hlp \* 10`
                    t_mitem[$kolom]=$((t_mitem[$kolom]+$t_mul+1))       
                elif (( $(bc <<<"$rij == 1 && $kolom == 1") )); then        
                    t_mitem[$kolom]=$((t_mitem[$kolom]+1))              
                fi

                if [[ -z "${stack[$rij-1]}" ]]; then 
                    printf $t_sp2 
                else                    #item nog een vaste lemgte geven en uitvullen zodat kolom altijd even lang is
                    printf $t_sp0 && printf "${number}$((t_mitem[$kolom])))${normal}" && printf " Toevoegen " && printf $t_sp1 "${stack[$rij-1]}" && printf "${normal}"     #print het item op de juiste plek
                    sx=${t_mitem[$kolom]} && ws=${stack[$rij-1]} && h_mitem[${sx}]=${ws} && t_waarde="${t_waarde}|$((t_mitem[$kolom]))"
                fi
                t_mitem[$kolom]=$((t_mitem[$kolom]+1))      
            done
        printf "${normal}\n"
    done

ベストアンサー1

複雑な内容を理解しようとするのではなく、最初からやり直しました。

#!/bin/bash
stacklist=( stack1 stack2 stack3 stack4 )
stack1=( domoticz dashboard dashticz nodered x y z ttttttttttttttt)
stack2=( mosquitto mysql nginx registry apache phpmyadmin )
stack3=( nextpvr motioneye joomla squeezebox q w r qqqqqqqqqqqqq)
stack4=( portainer unify wireguard watchtower w e t wwwwwwwwww qqqqqqqqq)

normal=`echo "\033[00;00m"`    # normal white
menu=`echo "\033[36m"`         # blue
number=`echo "\033[33m"`       # yellow

prefix='   '
for h in "${stacklist[@]}" ; do
    printf "$menu%s$normal" "$prefix------- RPI-$h ------     "
done
printf '\n\n'
for i in $(seq 0 ${#stack1[@]}) ; do
    printf "$prefix"
    for s in {1..4} ; do
        value=stack$s[$i]
        if [[ ${!value} ]] ; then
            printf "$number%2d) $normal"'Toevoegen %-19s' $((i+s*10-9)) "${!value}"
        else
            printf '%33s' ""
        fi
    done
    echo
done

おすすめ記事