Bash todoscript, den ich geschrieben habe.

1.2 löschen update (zu löschendes TODO wird angezeigt)

2.0 Idiotensichern (DokumentenLänge -> hilfe) Rewrite list mechanismus list mit zeile möglich löschen mit Farbcodierung 2.1 fixed Zweistellige todoanzahl fehler Dokumentenlänge falsch ausgelesen delete Längencheck logisch falsch abgefragt


#!/bin/bash

# DON'T BE A DICK PUBLIC LICENSE

#> Version 1.1, December 2016

#> Copyright (C) 2023 Lovis Rentsch

#Everyone is permitted to copy and distribute verbatim or modified
#copies of this license document.

#> DON'T BE A DICK PUBLIC LICENSE
#> TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

#1. Do whatever you like with the original work, just don't be a dick.

#   Being a dick includes - but is not limited to - the following instances:

# 1a. Outright copyright infringement - Don't just copy this and change the name.
# 1b. Selling the unmodified original with no work done what-so-ever, that's REALLY being a dick.
# 1c. Modifying the original work to contain hidden harmful content. That would make you a PROPER dick.

#2. If you become rich through modifications, related works/services, or supporting the original work,
#share the love. Only a dick would make loads off this work and not buy the original work's
#creator(s) a pint.

#3. Code is provided with no warranty. Using somebody else's code and bitching when it goes wrong makes
#you a DONKEY dick. Fix the problem yourself. A non-dick would submit the fix back.

# v2.1

#shellcolorcodes von stackoverflow
RCol='\e[1m'    # Text Reset

# Regular           Bold                Underline           High Intensity      BoldHigh Intens     Background          High Intensity Backgrounds
Bla='\e[0;30m';     BBla='\e[1;30m';    UBla='\e[4;30m';    IBla='\e[0;90m';    BIBla='\e[1;90m';   On_Bla='\e[40m';    On_IBla='\e[0;100m';
Red='\e[0;31m';     BRed='\e[1;31m';    URed='\e[4;31m';    IRed='\e[0;91m';    BIRed='\e[1;91m';   On_Red='\e[41m';    On_IRed='\e[0;101m';
Gre='\e[0;32m';     BGre='\e[1;32m';    UGre='\e[4;32m';    IGre='\e[0;92m';    BIGre='\e[1;92m';   On_Gre='\e[42m';    On_IGre='\e[0;102m';
Yel='\e[0;33m';     BYel='\e[1;33m';    UYel='\e[4;33m';    IYel='\e[0;93m';    BIYel='\e[1;93m';   On_Yel='\e[43m';    On_IYel='\e[0;103m';
Blu='\e[0;34m';     BBlu='\e[1;34m';    UBlu='\e[4;34m';    IBlu='\e[0;94m';    BIBlu='\e[1;94m';   On_Blu='\e[44m';    On_IBlu='\e[0;104m';
Pur='\e[0;35m';     BPur='\e[1;35m';    UPur='\e[4;35m';    IPur='\e[0;95m';    BIPur='\e[1;95m';   On_Pur='\e[45m';    On_IPur='\e[0;105m';
Cya='\e[0;36m';     BCya='\e[1;36m';    UCya='\e[4;36m';    ICya='\e[0;96m';    BICya='\e[1;96m';   On_Cya='\e[46m';    On_ICya='\e[0;106m';
Whi='\e[0;37m';     BWhi='\e[1;37m';    UWhi='\e[4;37m';    IWhi='\e[0;97m';    BIWhi='\e[1;97m';   On_Whi='\e[47m';    On_IWhi='\e[0;107m';


#wo die tododatei liegt
todo=~/.todo


aufz() {
        # wenn die Aufzählunf als "exten" gekennzeichnet ist
            # dann formatiere anders und echo
        if [[ $2 == "e" ]]
        then
            #entfernen der Dringlichkeitszahl
            rmurg=$(head -$1 $todo | tail +$1 | cut -c3-)

            #wenn "unwichtig, dann gelb"
            if [[ $(head -$1 $todo | tail +$1 | head -c 1) == 1 ]]
            then
                out="$out${BYel}$rmurg${Whi}"

            #wenn mittel, dann rot
            else if [[ $(head -$1 $todo | tail +$1 | head -c 1) == 2 ]]
            then
                out="$out${BRed}$rmurg${Whi}"

            #wenn wichtig, dann Lila
            else if [[ $(head -$1 $todo | tail +$1 | head -c 1) == 3 ]]
            then
                out="$out${BPur}$rmurg${Whi}"

            #wenn undefiniert, dann weiß und nicht "beschnitten"
            else
                out="$out${BWhi}$(head -$1 $todo | tail +$1)${Whi}"
            fi fi fi
            echo -e "${BWhi}$out"
        else
            #entfernen der Dringlichkeitszahl
            rmurg=$(head -$1 $todo | tail +$1 | cut -c3-)

            #wenn "unwichtig, dann gelb"
            if [[ $(head -$1 $todo | tail +$1 | head -c 1) == 1 ]]
            then
                out="$out \n $1 ${BYel}$rmurg${BWhi}"

            #wenn mittel, dann rot
            else if [[ $(head -$1 $todo | tail +$1 | head -c 1) == 2 ]]
            then
                out="$out \n $1 ${BRed}$rmurg${BWhi}"

            #wenn wichtig, dann Lila
            else if [[ $(head -$1 $todo | tail +$1 | head -c 1) == 3 ]]
            then
                out="$out \n $1 ${BPur}$rmurg${BWhi}"

            #wenn undefiniert, dann weiß und nicht "beschnitten"
            else
                out="$out \n $1 ${BWhi}$(head -$1 $todo | tail +$1)${BWhi}"
            fi fi fi
        fi
}

list() {

    #list variable
    out=""

    #inhalt der tododatei
    cont=$(cat $todo)

    #zeile, in der die Schleife beim Auslesen ist
    zeile=$(cat $todo | wc -l)+1

    #Schleife, durch alle  Zeilen der TODO Datei (Mit Abfrage, wie viele Zeilen es sind)
    for ((i = 1 ; i < $zeile ; i++)); do
        aufz "$i"
    done

    #Inhalt der Listvariable ausgeben
    echo -e "${BWhi}$out \n"
}

#inhalt der allgemeinen Hilfe
help_genreal() {
    echo -e "   todo.sh [${Gre}flag${Whi}] [${Cya}argument${Whi}]"
    echo -e "       ${BGre}-a / a${Gre} / add / --add ${Cya}      Priorität${Whi},${Cya} TODO"
    echo -e "       ${BGre}-d / d${Gre} / delete / --delete${Cya} Zeilennummer"
    echo -e "       ${BGre}-l / l${Gre} / list / --list"
    echo -e "   ${BPur}todo.sh help [${BGre}flag${BPur}]"
    echo -e "   ${Red}todo.sh help ${Gre} init${Whi}"
}

hilfe() {
    case "$#" in
        #wenn kein Hilfsargument gegeben ist
        0)
            help_genreal
            ;;

        1)
        #verschiedene Hilfsargumente
        case "$1" in
            -d | --delete | delete | d)
                echo -e "   todo.sh ${BGre}-d / d${Gre} / delete / --delete ${Whi}[${Cya}Zeilennummer${Whi}]"
                ;;

            -a | --add | add | a)
                echo -e "   todo.sh ${BGre}-a / a${Gre} / add / --add ${Whi}[${Cya}Dringlichkeit (1; 2; 3), TODO (Leerzeichen nut mit Anführungszeichen)${Whi}]"
                ;;

            init)
                echo -e "  \n Es wird empfohlen den 'init' Befehl zu nutzen, wenn das Programm zum ersten Mal benutzt wird."
                ;;

            -l | --list | list | l)
                echo -e "   todo.sh ${BGre}- / l${Gre} / list / --list ${Whi}[${Cya}leer, oder Zeilenzahl${Whi}]"
                ;;
            *)
            #wenn ein ungültiges Hilfsagrument gegeben ist
                help_genreal
                ;;

        esac
        ;;
    esac
}

#erstmaliges benutzen
init() {
    #datei erstellen
    touch $todo

    #Beispielinhalt
    echo "1 Erstelle deine ersten TODOs" >> $todo
    echo "3 todo.sh -h" >> $todo
}

case "$#" in
    #wenn kein Argument gegeben ist, verweise zu "Hilfe"
    0)
        hilfe
        list
        ;;

    #es sind 4 Argumente möglich
    1 | 2 | 3 | 4)
        case "$1" in
            #add/Hinzufügen eines Punktes
            -a | --add | a | add)
                #wenn keine ausreichenden Argumente gegeben sind, verweise auf die Hilfe
                #wenn ein weiterer Parameter gegeben ist, verweise auf die "add hilfe"
                if [[ $2 == "" || $3 == "" || $4 != "" || $2 > 3 ]]
                then
                    hilfe "add"
                else
                    #setze die gegebenen Parameter (Dringlichkeit, TODO) in die gegebene TODO Datei
                    echo "$2 $3" >> $todo
                    list
                fi
                ;;

            -h | h | --help | help)

                #wenn keine Spezifizierung vorgenommen, verweise auf die allgemeine Hilfe
                if [[ $2 == "" ]]
                then
                    hilfe
                else
                    #sonst die Hilfe zum gegeben Thema
                    hilfe "$2"
                fi
                ;;

            -l | l | --list | list)
                #dokumentenlänge check
                za=$(wc -l $todo | head -c 1)+1

                #wenn kein Argument gegeben, dann standart list
                if [[ $2 == "" ]]
                then
                    list
                else
                    #wenn es gegeben ist und der Dokumentenlänge entspricht, dann
                    if [[ $2 < $za ]]
                    then

                        #list als "extern"
                        aufz "$2" "e"
                    else

                        #sonst hilfe
                        hilfe "list"
                    fi
                fi
                ;;

            d | -d | --delete | delete)

                #wenn keine zu löschende Zeile gegeben ist, verweise auf die Hilfe
                if [[ $2 == "" ]]
                then
                    hilfe "delete"
                else
                
                    #wenn die gegebene Zahl innerhalb der Dokumentgröße liegt, dann
                    za=$(cat $todo | wc -l)+1
                    if (( $2 < $za ))
                    then

                        #als "extern" aufzählen
                        z=$(aufz "$2" "e")
                        echo -e "Sicher, dass du '$z' löschen möchtest?"

                        #antwort abfragen
                        read -p "[y/N] "

                            #wenn Ja, dann lösche
                            if [[ $REPLY =~ ^[Yy]$ ]]
                            then
                                #(Formatierung)
                                a="$2d"
                                #lösche die gegebene Zeile
                                sed -i "$a" $todo
                                #und sende eine Löschbestätigung in Form einer aktualisierten Aufzählung der TODOs
                                list
                            else if [[ $REPLY =~ ^[Nn]$ ]]
                            #wenn nein
                            then
                                #dann abbrechen
                                echo -e "${Pur}Abgebrochen"
                            else if [[ $REPLY == "" ]]
                            #wenn nichts gegeben ist
                            then
                                # dann breche auch ab
                                echo -e "${Pur}Abgebrochen"
                            fi fi fi
                    
                    #wenn die Zahl zu groß ist, dann verweise auf Hilfe
                    else
                        hilfe "delete"
                    fi
                fi
                ;;

            --init | init)
                init
                list
                ;;

            *)
                #falsche Parameter führen zur allgemeinen Hilfestellung
                hilfe
                exit 1
                ;;

        esac
        ;;
esac