Hallo Leute,
ich bastle schon den ganzen Nachmittag an einem Shell Script, dass mir etwas Arbeit erleichtern soll. Auf meinen Entwicklungsrechner (MacBook mit Mac OS X) gibt es keinen DNS-Server. Ich editiere jedes mal händisch die /etc/hosts Datei. Um das ganze etwas bequemer zu gestalten, wollte ich nun die Schritte in ein Bash Script auslagern:
#!/usr/bin/env bash
hosts="/etc/hosts"
function doAdd() {
hosts=$1
if grep -iq ".+""$2\$" "$hosts"
then
echo "bereits vorhanden."
else
echo "fuege $2 ein..."
if echo "$2" | grep -iq "^www\."
then
echo "WWW gefunden!"
shortenedUrl=$(echo "${2:4}")
# read everything into a var and surpress output by streaming it to /dev/null
read -d '' myWwwOut <<- WWWOUT
127.0.0.1 $shortenedUrl
127.0.0.1 $2
WWWOUT
echo "$myWwwOut" | sudo tee -a "$hosts" > /dev/null
else
echo "ohne WWW!"
read -d '' myOut <<- OUT
127.0.0.1 $2
127.0.0.1 www.$2
OUT
echo "$myOut" | sudo tee -a "$hosts" > /dev/null
fi
fi
}
function doRemove() {
hosts=$1
if grep -iq ".+""$2\$" "$hosts"
then
echo "fuege $2 ein..."
if echo "$2" | grep -iq "^www\."
then
echo "WWW gefunden!"
shortenedUrl=$(echo "${2:4}")
escUrl=$(echo "$shortenedUrl" | sed -e 's/\./\\./g')
cat "$hosts" | sed -e 's/^.+[www]\.*'"$escUrl"'$//g' | sed -e 's/\r+$//g' | sudo tee "$hosts" > /dev/null
else
escUrl=$(echo "$2" | sed -e 's/\./\\./g')
cat "$hosts" | sed -e 's/^.+[www]\.*'"$escUrl"'$//g' | sed -e 's/\r+$//g' | sudo tee "$hosts" > /dev/null
fi
else
echo "nicht in $hosts vorhanden, nichts zu tun."
fi
}
if [[ $1 == "add" ]]
then
# this parameter is needed, because function causes execution in its own subshell, which does not have outer scope globally defined variables.
doAdd $hosts $2
elif [[ $1 == "rm" ]]
then
doRemove $hosts $2
fi
Alles anzeigen
Das Hinzufügen von Einträgen (Funktion doAdd) klappt, das Löschen (Funktion doRemove) jedoch nicht.
Ich hab es einzeln getestet und ich kann definitiv sagen, dass es am Regulären Ausdruck liegt, der anscheinend noch falsch formuliert ist.
Es soll im Prinzip folgendes beim Löschen der Zeilen aus /etc/hosts tun:
- Suche nach der Domain mit oder ohne führendes www.
- ersetze den mehrzeiligen String bei Vorkommnissen durch nichts (= regex Löschen)
- schreibe die generierte Ausgabe via sed wieder zurück in die selbe Datei (/etc/hosts)
Ich bin mir auch nicht sicher, ob das mit dem String Concat so passt. Soviel ich weiß sorgen einfache Anführungszeichen für keine Variableninterpretation und doppelte schon. Deswegen habe ich mehrere hintereinander so geschrieben beim eigentlichen Ausführungskommando. Bei einem kurzen Test funktionierte das jedoch wie so dargestellt.
Über Tipps, Verbesserungsempfehlungen wäre ich sehr dankbar. Ich bin schließlich noch Bash Scripting Anfänger.
MFG
derwunner