ubuntuusers.de

bash-script: Problem mit variablenübergabe an AWK

Status: Gelöst | Ubuntu-Version: Kubuntu 14.04 (Trusty Tahr)
Antworten |

killercorny

(Themenstarter)
Avatar von killercorny

Anmeldungsdatum:
24. März 2015

Beiträge: 53

Wohnort: Brandenburg

So, ich bin fürs erste fertig mit meinem script. Es ist quasi ein motd-script und läuft bei mir bei jedem login, auch per ssh. Probierts mal aus.. 😉

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#!/bin/bash
 
PROCCOUNT=`ps -Afl | wc -l`
PROCCOUNT=`expr $PROCCOUNT - 5`
GROUPZ=`groups`
ETH0ADRESS=`ifconfig eth0 2>/dev/null | grep "inet " | awk -F: '{print $2}' | awk '{print $1}'`
WLAN0ADRESS=`ifconfig wlan0 eth0 2>/dev/null | grep "inet " | awk -F: '{print $2}' | awk '{print $1}'`
#wenn variable leer, dann...
if [ -z "$ETH0ADRESS" ] ; then 
  ETH0ADRESS="\e[1;31mnot connected\e[00m"
fi
if [ -z "$WLAN0ADRESS" ] ; then 
  WLAN0ADRESS="\e[1;31mnot connected\e[00m"
fi

if [[ $GROUPZ == *irc* ]]; then
  ENDSESSION=`cat /etc/security/limits.conf | grep "@irc" | grep maxlogins | awk {'print $4'}`
  PRIVLAGED="IRC Account"
else
  ENDSESSION="Unlimited"
  PRIVLAGED="Regular User"
fi
UPTIME_DAYS=$(expr `cat /proc/uptime | cut -d '.' -f1` % 31556926 / 86400)
UPTIME_HOURS=$(expr `cat /proc/uptime | cut -d '.' -f1` % 31556926 % 86400 / 3600)
UPTIME_MINUTES=$(expr `cat /proc/uptime | cut -d '.' -f1` % 31556926 % 86400 % 3600 / 60)


if [ "$XDG_CURRENT_DESKTOP" = "" ]
then
  desktop=$(echo "$XDG_DATA_DIRS" | sed 's/.*\(xfce\|kde\|gnome\).*/\1/')
else
  desktop=$XDG_CURRENT_DESKTOP
fi
#desktop=${desktop,,}  # convert to lower case

#einlesen der physischen hdds -> array
disks=( $(sed -ne 's/.*\([sh]d[a-zA-Z]\+$\)/\1/p' /proc/partitions) )
#alle disks ausgeben:
for i in ${disks[@]}; do 
  #groesse der hdds auslesen, filtern
  size=$(lsblk | awk -v disklabel=$i '$1==disklabel{print $4}')
  #TODO: komma durch punkt ersetzen, G durch _G
  device=/dev/$i #geraetenamen erstellen
  partspace=$(df --local --block-size=1M --output=avail,source ${device}?* | grep -oP "(\d+(?=\s${device}\d+))")
  for k in ${partspace[@]}; do
    #aufsummieren des freien platzes
    ((freesize+=$k))
  done
  #groesse umrechnen
  if [ $freesize -gt 1100 ];
    then
      freesize=`echo "scale=1; $freesize / 1024" | bc`"G"
    else
      freesize=$[$freesize]"M"
  fi
  #ausgabe zusammenfassen
  freestring=$freestring"\e[1;31m${i}: \033[32m${size}iB \033[34m(${freesize}iB free)\e[00m "
  freesize=0  #null setzen fuer naechsten durchlauf
done


echo -e "\033[1;32m 
\033[0;35m++++++++++++++++++++: \033[0;37mSystem Data\033[0;35m :++++++++++++++++++++++++++++
 \033[0;37mHostname \033[0;35m= \033[1;32m`hostname`
   \033[0;37mDistro \033[0;35m= \033[1;32m`lsb_release -s -d` with `uname -r`
  \033[0;37mDesktop \033[0;35m= \033[1;32m$desktop
  \033[0;37mAddress \033[0;35m= \033[1;32meth0: \033[34m$ETH0ADRESS  \033[1;32mwlan0: \033[34m$WLAN0ADRESS
   \033[0;37mKernel \033[0;35m= \033[1;32m`uname -r`
   \033[0;37mUptime \033[0;35m= \033[1;32m$UPTIME_DAYS days, $UPTIME_HOURS hours, $UPTIME_MINUTES minutes
      \033[0;37mCPU \033[0;35m= \033[1;32m`cat /proc/cpuinfo | grep 'model name' | head -1 | cut -d':' -f2`
   \033[0;37mMemory \033[0;35m= \033[1;32m`cat /proc/meminfo | grep MemTotal | awk {'print $2'}` kB / \033[34m`cat /proc/meminfo | grep MemFree | awk {'print $2'}` kB free
     \033[0;37mSwap \033[0;35m= \033[1;32m`free -m | tail -n 1 | awk {'print $2'}`M / `free -m | tail -n 1 | awk {'print $4'}`M free
     \033[0;37mDisk \033[0;35m= \033[1;32m$freestring

\033[0;35m+++++++++++++++++++++: \033[0;37mUser Data\033[0;35m :++++++++++++++++++++++++++++
  \033[0;37mUsername \033[0;35m= \033[1;32m`whoami`
 \033[0;37mPrivlages \033[0;35m= \033[1;32m$PRIVLAGED
  \033[0;37mSessions \033[0;35m= \033[1;32m`who | grep $USER | wc -l` of $ENDSESSION MAX
 \033[0;37mProcesses \033[0;35m= \033[1;32m$PROCCOUNT of `ulimit -u` MAX
\033[0;35m+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
"

ExcitedSpoon

Avatar von ExcitedSpoon

Anmeldungsdatum:
17. Juli 2010

Beiträge: 226

Wohnort: /home/berlin

Da du dort viel mit Escape Sequenzen für Farben hantierst bietet es sich an diese vorab in Variablen zu speichern. Das hilft das Ganze übersichtlicher zu machen, etwa so:

1
2
red="\033[0;31m"
echo -e "${red}hello"  

Besser ist's jedoch einfach tput die Escape Sequenzen bestimmen zu lassen, dann funktioniert das Ganze auch terminalübergreifend:

1
2
red=$(tput setaf 1)
echo -e "${red}hello"  

P.S.: Eigene Variablen immer klein schreiben.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17620

Wohnort: Berlin

killercorny schrieb:

1
2
3
#!/bin/bash
 
PROCCOUNT=`ps -Afl | wc -l`

Backticks. Er will uns provozieren.

1
PROCCOUNT=`expr $PROCCOUNT - 5`

Expr ist ein externer Programmaufruf. Solange Du das Programm nicht 100x pro Sekunde startest wahrscheinlich kein ernsthaftes Problem - nur Deiner Reputation schadet es, wenn man expr liest.

1
PROCCOUNT=$((PROCCOUNT - 5))
1
 ENDSESSION="Unlimited"

Das ist Cargo-Cult-Programming. Da ist kein Zeichen das der Maskierung bedarf.

1
2
3
UPTIME_DAYS=$(expr `cat /proc/uptime | cut -d '.' -f1` % 31556926 / 86400)
UPTIME_HOURS=$(expr `cat /proc/uptime | cut -d '.' -f1` % 31556926 % 86400 / 3600)
UPTIME_MINUTES=$(expr `cat /proc/uptime | cut -d '.' -f1` % 31556926 % 86400 % 3600 / 60)

Man würde einmal die Sekunden ermitteln:

1
2
3
4
5
upSecs=$(cat /proc/uptime | cut -d '.' -f1) 
upDays=$((upSecs % 31556926 / 86400)) # was macht das Modulo 31556926? 
# dafür sind Kommentare da - nicht um zu sagen, dass man etwas 0 setzt 
# wo es jeder sieht
upHours=$((upSecs % 31556926 % 86400 / 3600))

oder man macht es mit sed und einem Array:

1
dhmUp=($(uptime | sed 's/[:,]/ /g' | cut -d " " -f 6,10,11))

killercorny

(Themenstarter)
Avatar von killercorny

Anmeldungsdatum:
24. März 2015

Beiträge: 53

Wohnort: Brandenburg

In Zeile 7 hat sich noch ein Fehler eingeschlichen. Dort muss das "eth0" raus... @user unknown:

Kein Plan von was du da grad schreibst... Ich bin froh dass es überhaupt funktioniert und ich habe bereits mehrfach erwähnt dass ich alles andere als gut im Programmieren bin, geschweige denn dass ich mich mit gut Syntax auskenne oder weiß was man tun und lassen sollte. Vorschläge was man ändern könnte, so dass es auch in dem script funktioniert, nehm ich gerne an.

Also bitte, wenn was nicht so schön gelöst ist, bietet bitte eine korrekte Alternative/Lösung dazu an...

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17620

Wohnort: Berlin

Antworten |