programming:bash
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
programming:bash [2021/01/14 19:33] – [Zeitrechnung/Darstellung] frank | programming:bash [2023/06/08 17:06] (aktuell) – Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== Bash ====== | ||
+ | FIXME | ||
+ | |||
+ | CheatSheet: https:// | ||
+ | ==== root-check ==== | ||
+ | <code bash> | ||
+ | if [ $UID -eq 0 ];then echo " | ||
+ | </ | ||
+ | ==== online-check ==== | ||
+ | <code bash> | ||
+ | ping -c 1 ${HOST} -W 1 >/ | ||
+ | if [ $? -eq 0 ]; | ||
+ | then | ||
+ | echo "host is alive" | ||
+ | fi | ||
+ | </ | ||
+ | ==== Dateigröße ==== | ||
+ | <code bash> | ||
+ | fs=$(wc -c < file) | ||
+ | if [ $fs -eq 0 ]; | ||
+ | then | ||
+ | echo "file is empty" | ||
+ | fi | ||
+ | </ | ||
+ | |||
+ | ==== Massen-Datei-Verarbeitung ==== | ||
+ | <code bash> | ||
+ | for file in *.html | ||
+ | do | ||
+ | mv " | ||
+ | #" | ||
+ | done | ||
+ | |||
+ | #auch gut, um z.b. von mehreren Dateien die Checksumme zu errechnen und in gleichnamiger Datei zu hinterlegen | ||
+ | for file in *.gz; do md5sum " | ||
+ | |||
+ | #auch mit der Klammern-Auswertung lassen sich bestimmte Sachen machen | ||
+ | ls *.{php, | ||
+ | </ | ||
+ | ==== Farben ==== | ||
+ | <code bash> | ||
+ | clr_red=$' | ||
+ | clr_green=$' | ||
+ | clr_yellow=$' | ||
+ | clr_blue=$' | ||
+ | clr_reset=$' | ||
+ | </ | ||
+ | <code bash> | ||
+ | echo ${clr_red}test${clr_reset} | ||
+ | </ | ||
+ | |||
+ | ==== logging ==== | ||
+ | einzelnen Befehl mitloggen (nur stderr) und gleichzeitig anzeigen (stdout+stderr) | ||
+ | <code bash> | ||
+ | #via Process Substitution (https:// | ||
+ | make 2> >( tee " | ||
+ | </ | ||
+ | ganzen Block mitloggen: | ||
+ | <code bash> | ||
+ | exec 3> >(tee logfile) | ||
+ | |||
+ | make alpha 2>&3 && | ||
+ | make bravo 2>&3 && | ||
+ | make charlie 2>&3 && success=1 | ||
+ | |||
+ | exec 3>&- | ||
+ | </ | ||
+ | |||
+ | komplettes script mitloggen (mit Anzeige): | ||
+ | |||
+ | exec &> >(tee -a " | ||
+ | |||
+ | Möglichkeiten echo an stderr zu schicken: | ||
+ | |||
+ | echoerr() { echo " | ||
+ | |||
+ | echoerr hello world | ||
+ | |||
+ | https:// | ||
+ | |||
+ | ==== Debug-Modus ==== | ||
+ | |||
+ | am Anfang des Scripts: | ||
+ | |||
+ | test -n " | ||
+ | #Anzeige der aktuellen Datei (funktioniert auch wenn ge-source-d) | ||
+ | test -n " | ||
+ | |||
+ | Aufruf mit: | ||
+ | |||
+ | DEBUG=y script.sh | ||
+ | |||
+ | ggf. mit PS4 die Ausgabe anpassen ([[https:// | ||
+ | |||
+ | PS4=' | ||
+ | ==== vorherige Instanzen beenden ==== | ||
+ | |||
+ | <code bash> | ||
+ | #kill previous instances of current script | ||
+ | script_name=${BASH_SOURCE[0]} | ||
+ | for pid in $(pidof -x $script_name); | ||
+ | if [ $pid != $$ ]; then | ||
+ | kill -9 $pid | ||
+ | fi | ||
+ | done | ||
+ | </ | ||
+ | |||
+ | https:// | ||
+ | ==== Case ==== | ||
+ | |||
+ | <code bash> | ||
+ | case " | ||
+ | *foo*) | ||
+ | # irgendwas | ||
+ | ;; | ||
+ | [1-6]*) | ||
+ | # | ||
+ | ;; | ||
+ | " | ||
+ | multiple values | ||
+ | ;; | ||
+ | *) | ||
+ | #alles andere | ||
+ | ;; | ||
+ | esac | ||
+ | </ | ||
+ | |||
+ | fallthrough (;&) and resume (;;&) https:// | ||
+ | ==== arrays ==== | ||
+ | <code bash> | ||
+ | arr=(a b c d e f g h) | ||
+ | arr[8]=" | ||
+ | unset arr[2] #entfernt 3. Element | ||
+ | echo ${arr[@]} #ganzes Array anzeigen | ||
+ | echo ${#arr[@]} #Anzahl der Elemente | ||
+ | arr+=(' | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Eingabe mit Vorbelegung ==== | ||
+ | <code bash> | ||
+ | name=" | ||
+ | read -e -i " | ||
+ | name=" | ||
+ | </ | ||
+ | |||
+ | ==== Stringmanipulation ==== | ||
+ | In Bash 4: | ||
+ | alles klein | ||
+ | |||
+ | <code bash>$ echo " | ||
+ | alles groß: | ||
+ | |||
+ | <code bash>$ echo " | ||
+ | [[https:// | ||
+ | |||
+ | === Pfad / Verzeichnis === | ||
+ | |||
+ | <code bash> | ||
+ | $ VAR=/ | ||
+ | $ DIR=$(dirname " | ||
+ | $ echo " | ||
+ | / | ||
+ | $ basename " | ||
+ | file.c | ||
+ | </ | ||
+ | |||
+ | <code bash> | ||
+ | ~% FILE=" | ||
+ | ~% echo " | ||
+ | example | ||
+ | ~% echo " | ||
+ | example.tar | ||
+ | ~% echo " | ||
+ | tar.gz | ||
+ | ~% echo " | ||
+ | gz | ||
+ | </ | ||
+ | mehr infos [[https:// | ||
+ | |||
+ | === Teilstrings === | ||
+ | |||
+ | <code bash> | ||
+ | a=string | ||
+ | b=${a:p:l} | ||
+ | #p=Position (0-basiert), | ||
+ | </ | ||
+ | === ersetzen === | ||
+ | |||
+ | <code bash> | ||
+ | orig=" | ||
+ | mod=${orig// | ||
+ | </ | ||
+ | === Regex-Prüfung === | ||
+ | |||
+ | <code bash> | ||
+ | string=' | ||
+ | | ||
+ | if [[ $string =~ .*My.* ]] | ||
+ | then | ||
+ | echo " | ||
+ | fi | ||
+ | </ | ||
+ | |||
+ | === Split via Trennzeichen === | ||
+ | |||
+ | <code bash> | ||
+ | OLDIFS=" | ||
+ | IFS=' | ||
+ | #echo "array (" | ||
+ | #echo "first item: ${array[0]}" | ||
+ | IFS=" | ||
+ | </ | ||
+ | |||
+ | Alternative wenn mehrere Teile direkt weiterverwendet werden sollen (hier Berechnung der nächsten Kernelversion für inkrementellen Patch): | ||
+ | |||
+ | <code bash> | ||
+ | k=$(make kernelversion) | ||
+ | #4.4.140 | ||
+ | kn=$(echo $k|awk -F. ' | ||
+ | #4.4.141 | ||
+ | kf=$(echo $k|awk -F. ' | ||
+ | # | ||
+ | </ | ||
+ | |||
+ | === string mehrfach === | ||
+ | |||
+ | printf ' | ||
+ | |||
+ | https:// | ||
+ | ==== rechnen ==== | ||
+ | |||
+ | GPIO_NO=$((232+25)) | ||
+ | |||
+ | alternativ (z.B. für array-Index) | ||
+ | |||
+ | COL=0 | ||
+ | id=${array[$[ COL++ ]]} | ||
+ | |||
+ | Ausführzeit | ||
+ | |||
+ | <code bash> | ||
+ | P1=$(date +%s) #starttime as unix-time | ||
+ | #do something | ||
+ | P2=$(date +%s) #endtime as unixtime | ||
+ | echo $[$P2-$P1] #calculate and print the difference | ||
+ | </ | ||
+ | ==== Zahlenbereiche ==== | ||
+ | |||
+ | ls IMG_20170923_{17..18}* | ||
+ | |||
+ | ==== Sprache ==== | ||
+ | |||
+ | kurzzeitig umstellen (z.b. um Fehlermeldungen auf englisch zu bekommen für Foren): | ||
+ | |||
+ | LANG=C | ||
+ | |||
+ | ==== Prompt ==== | ||
+ | |||
+ | export PS1=" | ||
+ | |||
+ | in die ~/.bashrc | ||
+ | |||
+ | Farben lassen sich so realisieren | ||
+ | |||
+ | \[\033[1; | ||
+ | \[\033[1; | ||
+ | \[\033[1; | ||
+ | |||
+ | https:// | ||
+ | ==== LS_COLORS ==== | ||
+ | |||
+ | | ||
+ | export LS_COLORS=' | ||
+ | |||
+ | [[http:// | ||
+ | |||
+ | === Farben temporär deaktivieren === | ||
+ | |||
+ | |||
+ | \ls | ||
+ | | ||
+ | Oder | ||
+ | |||
+ | dir | ||
+ | ==== Zeit-Darstellung ==== | ||
+ | |||
+ | eigene locale für Datum nehmen | ||
+ | |||
+ | LC_ALL=de_DE.utf8 date ' | ||
+ | |||
+ | eigene Zeitzone | ||
+ | |||
+ | export TZ=Europe/ | ||
+ | dt=$(date +" | ||
+ | |||
+ | ==== Zeitrechnung ==== | ||
+ | |||
+ | Zeitstempel als String (für Backups) | ||
+ | |||
+ | D=$(date +" | ||
+ | |||
+ | Zeitrechnung (+1 Tag) | ||
+ | |||
+ | DT=$(date -d "+1 day" +" | ||
+ | |||
+ | Umrechnung in Unix-Zeitstempel | ||
+ | |||
+ | date -d " | ||
+ | 1528938000 | ||
+ | |||
+ | Unix-Zeitstempel zurückformatieren | ||
+ | |||
+ | date -d " | ||
+ | 14.06.18 03:00:00 | ||
+ | |||
+ | Berechung (MySQL-Zeitstempel -10 Minuten) | ||
+ | |||
+ | <code bash> | ||
+ | sd=$(date -d " | ||
+ | sd2=$(($sd-10*60)) | ||
+ | date -d " | ||
+ | 18-06-14 02:50:00 | ||
+ | </ | ||
+ | |||
+ | ==== MySQL in Bash ==== | ||
+ | <code bash> | ||
+ | H=host | ||
+ | U=user | ||
+ | P=password | ||
+ | D=database | ||
+ | T=table | ||
+ | LOGFILE=/ | ||
+ | |||
+ | Q=" | ||
+ | data=$(mysql -h$H -u$U -p$P -D$D -Bse " | ||
+ | [ $? = 0 ] || echo $data >> $LOGFILE | ||
+ | |||
+ | while read line; do | ||
+ | echo " | ||
+ | IFS=$' | ||
+ | echo "1st col: ${STR_ARRAY[0]}" | ||
+ | echo "2nd col: ${STR_ARRAY[1]}" | ||
+ | echo "3rd col: ${STR_ARRAY[2]}" | ||
+ | done <<< | ||
+ | </ | ||
+ | |||
+ | ==== Grep ==== | ||
+ | |||
+ | nach mehreren Strings suchen (ODER) | ||
+ | |||
+ | grep ' | ||
+ | |||
+ | regex | ||
+ | |||
+ | grep ' | ||
+ | |||
+ | ==== SED ==== | ||
+ | |||
+ | suchen ersetzen | ||
+ | |||
+ | sed ' | ||
+ | |||
+ | sed ' | ||
+ | | ||
+ | Mehrfach-Ersetzung: | ||
+ | |||
+ | sed -e ' | ||
+ | sed -ibak -e ' | ||
+ | |||
+ | https:// | ||
+ | |||
+ | text zwischen Start- und Endmarkierung ausgeben | ||
+ | |||
+ | sed -n -e '/ | ||
+ | |||
+ | ==== diff ==== | ||
+ | |||
+ | git diff ähnliche Ausgabe | ||
+ | |||
+ | diff -urpN < | ||
+ | ==== tar ==== | ||
+ | |||
+ | Zielverzeichnis angeben | ||
+ | |||
+ | tar -C $dir -xzf $file | ||
+ | |||
+ | System-backup | ||
+ | |||
+ | tar -cvpzf backup.tar.gz --exclude=backup.tar.gz --one-file-system / | ||
+ | |||
+ | ==== Parameter parsen ==== | ||
+ | |||
+ | [[https:// | ||
+ | |||
+ | <code bash> | ||
+ | #!/bin/bash | ||
+ | LOG=0 | ||
+ | TEST=0 | ||
+ | usage() { | ||
+ | echo "$0 allowed options:" | ||
+ | echo -e '\t -l|--log|--logging\tenable Logging' | ||
+ | echo -e '\t -t|--test\tenable Testmode' | ||
+ | } | ||
+ | while [ " | ||
+ | PARAM=$(echo $1 | awk -F= ' | ||
+ | VALUE=$(echo $1 | sed ' | ||
+ | echo $PARAM" | ||
+ | case $PARAM in | ||
+ | -l|--log|--logging) | ||
+ | echo " | ||
+ | LOG=1; | ||
+ | ;; | ||
+ | -t|--test) | ||
+ | echo " | ||
+ | TEST=1; | ||
+ | ;; | ||
+ | *) | ||
+ | echo " | ||
+ | usage | ||
+ | exit 1 | ||
+ | ;; | ||
+ | esac | ||
+ | shift | ||
+ | done | ||
+ | </ | ||
+ | |||
+ | ==== ip-adresse ==== | ||
+ | |||
+ | ip -4 -o addr show enp3s0 | sed ' | ||
+ | |||
+ | ==== find / exec ==== | ||
+ | |||
+ | find . -name ' | ||
+ | |||
+ | ==== Dateien umbenennen/ | ||
+ | |||
+ | OLDIFS=$IFS; | ||
+ | |||
+ | mögliche Alternative (ganz unten wg. Whitespaces): | ||
+ | https:// | ||
+ | |||
+ | ==== alias / oneline function ==== | ||
+ | |||
+ | alias t=' | ||
+ | unalias t | ||
+ | |||
+ | hxd() { hd " | ||
+ | |||
+ | ==== git info ==== | ||
+ | |||
+ | < | ||
+ | parseGitBranch() { | ||
+ | git rev-parse --abbrev-ref HEAD 2> /dev/null | sed -e ' | ||
+ | } | ||
+ | |||
+ | gitstatus() { | ||
+ | status=$(git status --short 2> /dev/null) | ||
+ | if [[ $? -eq 0 ]];then | ||
+ | modified=$(echo " | ||
+ | untracked=$(echo " | ||
+ | echo " [${modified}M${untracked}U]"; | ||
+ | fi | ||
+ | } | ||
+ | |||
+ | if [ " | ||
+ | PS1=' | ||
+ | else | ||
+ | PS1=' | ||
+ | fi | ||
+ | |||
+ | unset color_prompt force_color_prompt | ||
+ | </ | ||
+ | |||
+ | ==== xterm title ==== | ||
+ | |||
+ | < | ||
+ | trap 'echo -ne " | ||
+ | function show_name(){ | ||
+ | if [[ -n " | ||
+ | then | ||
+ | echo -en " | ||
+ | else | ||
+ | echo -en " | ||
+ | fi | ||
+ | } | ||
+ | export PROMPT_COMMAND=' | ||
+ | </ | ||
+ | |||
+ | https:// |
programming/bash.txt · Zuletzt geändert: 2023/06/08 17:06 von 127.0.0.1