2016-04-10 14 views
0

Ich habe ein Standard-Banner, das ich für alle meine Server verwende, und ich habe sie normalerweise von Hand eingegeben, aber da meine Flotte von Servern wächst, ist es Zeit, dies zu automatisieren.Wie zentriert man eine Textzeile in einer festen Breite?

Typischerweise sollte mein Banner wie folgt aussehen:

***************************************************************** 
*  .:Welcome to hostname.internal.mynet.net:.    * 
*                * 
* This is a private server maintained by and exclusively for * 
* use by me. No authorization is given or granted to any party * 
* unless explicit permission is given. Attempts to circumvent, * 
* disable, or otherwise interfere with normal operation will be * 
* prosecuted to the fullest extent of applicable laws.   * 
*                * 
*    UNAUTHORIZED ACCESS PROHIBITED     * 
***************************************************************** 

Dies ist der gewünschte Effekt, aber meine Host-Namen sind Zeichen unterschiedlicher, so dass es nicht formatiert werden manchmal nicht richtig, zum Beispiel:

***************************************************************** 
*  .:Welcome to somelongrandomhostname.internal.mynet.net:.  * 
*                * 
* This is a private server maintained by and exclusively for * 
* use by me. No authorization is given or granted to any party * 
* unless explicit permission is given. Attempts to circumvent, * 
* disable, or otherwise interfere with normal operation will be * 
* prosecuted to the fullest extent of applicable laws.   * 
*                * 
*    UNAUTHORIZED ACCESS PROHIBITED     * 
***************************************************************** 

und wenn ein kürzerer Host-Name:

***************************************************************** 
*  .:Welcome to abc.internal.mynet.net:.  * 
*                * 
* This is a private server maintained by and exclusively for * 
* use by me. No authorization is given or granted to any party * 
* unless explicit permission is given. Attempts to circumvent, * 
* disable, or otherwise interfere with normal operation will be * 
* prosecuted to the fullest extent of applicable laws.   * 
*                * 
*    UNAUTHORIZED ACCESS PROHIBITED     * 
***************************************************************** 

Der entsprechende Code, den ich in meinem Skript verwenden zu erzeugen, ist dies:

# banner 
echo " 
***************************************************************** 
*  .:Welcome to $hostname.internal.mynet.net:.    * 
*                * 
* This is a private server maintained by and exclusively for * 
* use by me. No authorization is given or granted to any party * 
* unless explicit permission is given. Attempts to circumvent, * 
* disable, or otherwise interfere with normal operation will be * 
* prosecuted to the fullest extent of applicable laws.   * 
*                * 
*    UNAUTHORIZED ACCESS PROHIBITED     * 
***************************************************************** " > banner 

Ich bin nicht sicher, wie oder was als das beste Tool zu verwenden, um das Banner genau zu erzeugen, wie im ersten Beispiel vorgesehen, unabhängig von der Länge des Hostnamen? Auf der Suche nach Ideen sollte der "Rahmen" (wie durch die Sternchen gekennzeichnet) ein fester Wert sein.

+0

Sie können berechnen, wie viele Leerzeichen Sie mit '$ {# hostname}' beginnen möchten. –

Antwort

1

Sie können mit den Parametern in diesem Snippet rumspielen:

#!/bin/sh 

for h in io sun moon earth quaoar neptune ganymede alphaCentauri; do 
    pad=$(printf '%*s.:Welcome to %s.internal.mynet.net:.\n' \ 
     -$(expr 20 - ${#h}/2) " " "$h") 
    printf '* %-75s *\n' "$pad" 
done 

die Ausgabe wie

*     .:Welcome to io.internal.mynet.net:.      * 
*     .:Welcome to sun.internal.mynet.net:.     * 
*     .:Welcome to moon.internal.mynet.net:.     * 
*     .:Welcome to earth.internal.mynet.net:.     * 
*     .:Welcome to quaoar.internal.mynet.net:.     * 
*     .:Welcome to neptune.internal.mynet.net:.     * 
*     .:Welcome to ganymede.internal.mynet.net:.     * 
*    .:Welcome to alphaCentauri.internal.mynet.net:.    * 

gibt Welche ${#h} nutzt die Anzahl der Zeichen in $h zu erhalten, teilt die von zwei, und verwendet 20 minus dieser Anzahl von Leerzeichen, um nach links zu puffern. Beachten Sie die Verwendung des %*s printf-Formatspezifizierers mit einem negativen-Argument, um anzugeben, linksbündig Platzierung. Das Ergebnis wird dann für eine Zeichenfolge mit fester Breite 75 verwendet.

+0

Danke! Das war sehr hilfreich, und ich konnte herausfinden, was ich brauchte, um es zum Laufen zu bringen. – digilink