bash scripting - Ausgabe Problem

Alles, was nicht direkt mit Python-Problemen zu tun hat. Dies ist auch der perfekte Platz für Jobangebote.
Antworten
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hallo,

tut mir leid, ziemlich off-topic, aber ich frage lieber hier nach, als sonst wo :D

Also, es handelt sich um folgendes: Z. Zt. schreibe ich einen Haufen kleinerer Shellskripte (bash, leider kein Python) und das klappt auch erstaunlich gut, wenn man mal von dieser völlig kruden Syntax absieht.
U. A. gibt es da dieses Hilfsskript, das eigentlich nur winzige Funktionalität für ein anderes Skript zur Verfügung stellt:

Code: Alles auswählen

#! /bin/bash

#define a help message:
function usage()
{
    echo "linblock will print a given message surrounded by a box on"
    echo "the screen. The default box is made up by '='. Using the"
    echo "option '-s' plus a string it is possible to change this"
    echo "default separator."
    echo ""
    echo "invoke like:"
    echo "linblock [-s] <message>"
}

separator="=" #defining default separator
declare -ri width=60 #define default line width

while getopts ":s:" opt; do
    case $opt in
        s  ) separator=$OPTARG;;
        \? ) usage ; exit 1

    esac
done
shift $(($OPTIND - 1))

#check whether a proper message was passed
if [ -z "$@" ]; then
    usage
    exit 1
fi

function extend_separator()
{
local lwidth=${width}
while [ $((lwidth--)) -ge 0 ]; do
    echo -n "${separator}"
done
echo "${separator}"
}

#start actual printing functionality
extend_separator
printf "%s%s%s%s%s %-50s %s%s%s%s%s\n" ${separator} ${separator} ${separator} ${separator} ${separator} ${1} ${separator} ${separator} ${separator} ${separator} ${separator}
extend_separator
exit 0
Nicht schön, aber ...
Nun ja, es sollte so etwas ausgeben (leider sieht es auch in code tags nicht so schön aus, aber ich hoffe, man kann erkennen worum es geht):

Code: Alles auswählen

./skript "wichtige Nachricht"
==========================================
===== wichtige Nachricht                                        =====
==========================================
stattdessen erhalte ich:

Code: Alles auswählen

./skript 
==========================================
===== wichtige                       Nachricht=====                                
==========================================
Warum? Wie kann ich das lösen?
Und (leider geht das "*"*5 = "*****" mit der Shell ja nicht) wie kann ich diese Zeile (printf "%s%s%s%s%s %-50s %s%s%s%s%s\n" ....) etwas eleganter schreiben?

Hat jemand eine Idee? Es geht mir ja eher insgesamt ums Formatieren, als um dieses blöde Beispiel.

Vielen Dank,
Christian

edit: zweimal editiert (zusätzliche Code Tags eingeführt, um das Stripping der Leerstellen zu verhindern)
BlackJack

Ganz einfach: ``${1}`` wird durch ``wichtige nachricht`` ersetzt, das sind zwei worte, also auch zwei Parameter. Darum wird ``nachricht`` zum ersten Separator in der Zeichenkette.

Abhilfe schaffen Anführungszeichen, die man beim Bash-Skripting immer benutzen sollte wenn eine Variable Leerzeichen enthalten kann.

Code: Alles auswählen

bj@s8n:~> text="wichige nachricht"
bj@s8n:~> seperator="="
bj@s8n:~> printf "%s %-20s %s\n" $seperator $text $seperator
= wichige              nachricht
=
bj@s8n:~> printf "%s %-20s %s\n" $seperator "$text" $seperator
= wichige nachricht    =
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Natürlich! Du hast absolut recht. Irgendwie sind sie unter den Tisch gefallen, die Anführungszeichen. (Gestern war erst Montag und dennoch bin ich schon reif fürs Wochenende :( )

Vielen Dank,
Christian
Antworten