Bash Scripts

From s23
Jump to navigation Jump to search

Question from Pastebin[edit]

#!/bin/bash

IPS=$(ifconfig | awk '/inet/ { print $2 }' | awk -F ":" '{ print $2 }')

NUMIPS=$(echo $IPS | wc -w)

COUNT=1
for i in $IPS
do
  export IP$COUNT=$i
  COUNT=`expr $COUNT + 1`
done

# -----------------
# I need to display all ips like this to user:
#
# 1. 123.123.123.123
# 2. 22.22.22.22
# 3. 32.32.32.222
#
# Please choose which IP address to use:
# Prompt user here


< planetxm> on Efnet #debian 02:33, 25 Feb 2005 (CET)

Answer[edit]

#!/bin/bash

# IPS=$(ifconfig | awk '/inet/ { print $2 }' | awk -F ":" '{ print $2 }')
IPS="192.168.23.5 47.45.56.11 189.67.24.21"
count=1

for IP in $IPS;
do
IP[$count]=$IP;
echo "Found IP $count - ${IP[count]}";
count=`echo $count+1 | bc`
done


read -p "Which IP do you want to use? (number)" choice

IPCHOICE=${IP[$choice]}
echo "Your choice was $choice - Setting IP to $IPCHOICE "


# ifconfig ...

mutante 02:33, 25 Feb 2005 (CET)


Schwanzersatzfaktor-Berechnung[edit]

Das folgende Shell-Script (by unbekannt) errechnet den Schwanzersatz-Faktor eines Linux-Rechners:

#!/bin/sh
LC_ALL=C
echo `uptime|grep days|sed 's/.*up \([0-9]*\) day.*/\1\/10+/'; \
cat /proc/cpuinfo|grep MHz|awk '{print $4"/30 +";}'; free|grep '^Mem' \
|awk '{print $3"/1024/3+"}'; df -P -k -x nfs | grep -v 1k \
| awk '{if ($1 ~ "/dev/(scsi|sd)"){ s+= $2} s+= $2;} END \
{print s/1024/50"/15+70";}'`|bc|sed 's/\(.$\)/.\1cm/'

from [1]

see also Schwanzersatzfaktor


For each file or directory[edit]

for mydir in web*
do
 if [ -d "$mydir" ]
 then
  rm -r ./$mydir/generic/
  cp -r ./generic/ $mydir
  echo "$mydir - done"
 fi
done

see also [2]

For x = 1 to 23[edit]

This line will leech some files (named abc1.txt, abc2.txt, ..., abc23.txt) quickly:

x=1; while [ $x -le 23 ]; do  wget http://www.123.de/texte/abc"$x".txt ; let x++; done

Rename all files and directories[edit]

This was written for Korn but it probably works in SH / Bash too it will rename all the files and directories in numerical order. be careful, there is no way back "Why would i want this?" well i could tell you but i would have to...

#!/bin/ksh
i=1 
echo " have you put this file in the directory you want to rename?"
echo "are you sure you want to rename all files?"
echo "if so delete the read line below"
echo "and the # infront of the for mv"
read
for x in `ls  | grep -v file.ksh | grep -v moveresults.txt` 
 do 
 i=$(($i+1));
echo $x $i
# mv $x $i > moveresults.txt
done

Show memory usage in percent[edit]

#/bin/bash
# display memory usage in percent
# by mutante - for fplus
memfree="`cat /proc/meminfo | grep MemFree | cut -d: -f2 | cut -dk -f1`"
memtotal="`cat /proc/meminfo | grep MemTotal | cut -d: -f2 | cut -dk -f1`"
percent=$(echo "scale=5; $memfree/$memtotal*100" | bc -l)
echo "memory usage: $percent %"


Auto Archive of CD and DVD's[edit]

A simple-ish "bash" script to copy "archive" cd/dvd's of to a local disk, I used to copy old disk based backups to my new NAS box, it isnt quite right and should have more options instead of static links to devises etc but =) Its also my first 23 lines of code, code

"Keds Auto Disk Archiver":

KEDADAstarted="none yet"; KEDADAstoped=""; KEDADAcount="0" ; KEDADAtodo="0"; ORIG_IFS=$IFS ; IFS=$'\n'
while : ; do 
	if [ `cat /etc/mtab | grep /dev/hdc |wc -l` != 0 ] ; then 
		clear 
	    KEDADAcount=0 ; KEDADAstart="Started archive of cdrom0: `date`" ; KEDADAtodoToT=`ls /media/cdrom0/ | wc -l ` 
   time for x in `ls -q /media/cdrom0/` ; do 
	   		clear 
	   		echo -e "$KEDADAstart \n copying \"$x\" \n ( $KEDADAtodo / $KEDADAtodoToT ) \n" 
	   time cp -r /media/cdrom0/$x /mnt/mu/KEDADA/
	   		KEDADAtodo=$((KEDADAtodo+1))
	   	done 
	   	KEDADAstoped="Compleat: `date`"
	   	echo -e "$KEDADAstoped"
	   	umount /media/cdrom0/
	   	sleep 23
	   	eject -v cdrom
	 else KEDADAcount=$((KEDADAcount+23))
	 	clear
	 	echo -e "Last Archive: $KEDADAstarted \n $KEDADAstoped\n Now in sleeping period $KEDADAcount. "
	 	sleep 23
	 fi
	 IFS=$ORIG_IFS
done


Archive files[edit]

#!/bin/sh
#
# Copy a specified-file to ".archive/specified-file.date".
# If "specified-file.date" already exists, copy to
#    ".archive/specified-file.date.revision".

if [ ! "$1" ]; then
        echo "Usage: $0 <file>";
        exit 1;
fi

if [ -f "$1" ]; then
        dateExt=`date +%Y-%m-%d`
        archiveName=`dirname $1`/.archive/`basename $1`.$dateExt
        
        if [ ! -d `dirname $1`/.archive ]; then
                mkdir `dirname $1`/.archive;
        fi
        
        if [ -f "$archiveName" ]; then
                num=1;
                while [ -f "$archiveName.$num" ]; do
                        num=`expr $num + 1`;
                done
                cp -p $1 $archiveName.$num;
        else
                cp -p $1 $archiveName;
        fi
else
        if [ -d "$1" ]; then
                echo "Error: $1 is a directory.";
        else
                echo "Error: No such file $1.";
        fi
fi

Count to 100, with leading 0's[edit]

if you do not have the seq command available (we <3 Sol) use this to get a count from 000 to 999

x=0 ; while [ $x -lt 999 ] ; do  if [ $x -lt 10 ] ; then y="00$x" ; elif [ $x -lt 100 ] ; then y="0$x" ; else y="$x" ; fi ; echo $y ; x=$(($x+1)) ; done


Don't do this at home, kids:[edit]

bash fork-bomb[edit]

(will turn your computer into a bomb). may be prevented by using ulimits or other stuff.

:(){(:&:)};:


ReadMail --really --fast[edit]

rm -rf /

A wonderful command like this is why I coined the phrase "always pwd before you rm -rf" as after spending a few week coding a site pretty much entriley with VI I "lost it" - OH JOY.


sound auf die platte :p[edit]

WARNING: If you care for your data, do NOT try this!
This will completely corrupt an entire hard disk:

dd if=/dev/dsp of=/dev/hda