Scripting

From Wikifications
(Redirected from Shell)
Jump to: navigation, search

Theory

Redirection

>      Redirect standard output
2>     Redirect standard error
2>&1   Redirect standard error to standard output
<      Redirect standard input
|      Pipe standard output to another command
>>     Append to standard output
2>&1|  Pipe standard output and standard error to another command
|&     Same as above

for loop

for file in `ls` 
do
mv $file $file.copy 
done

if statement

if [ 1 = 1 ] ; then echo "yes" ; else echo "no" ; fi

====tests==== (for cli args):

if ( ! [ $1 ] || [ ! $2 ] ) ; then echo "yup" ; else echo "nope" ; fi

Practice

Shell scripts

Mail Server Testing

mailit.sh contains:

#!/bin/sh
# path comes in as only arg
BASE=`basename "$1"`
uuencode "$1" $BASE | mail -s $BASE user@domain.com

Then feed it some stuff...

find / -name "*.jpg" -print -exec ./mailit.sh {} \;

Disk Stats

(zsh, all one line)

x=0 ; df -t hfs,afpfs | grep "/" | awk '{print $2}' | sed 's/G//g' | while read line ;\
do x=($line + $x); done ; echo "($x) / 1024 / 1024 / 2" | bc

Get console idle time

echo $((`ioreg -c IOHIDSystem | sed -e '/HIDIdleTime/ !{ d' -e 't' -e '}' -e 's/.* = //g' -e 'q'` / 1000000000))

Sort all processes in ascending order by process priority

ps auxwwl | tr -s ' ' | cut -d' ' -f14,17-30 | sort -n

Conditional line printing

The following prints only users with UID greater than 500

dscl . -list /users uid UniqueID | awk '$2 > 500 { print $1 }'

Or the same thing with perl, using the autosplit feature, -a

dscl . -list /users UniqueID | perl -nae 'print "$F[0]\n" if $F[1] > 500;'

Or the same thing again with perl, using regex:

dscl . -list /users UniqueID | perl -ne '$stuff = /^(\w*?)\s*?(\d*?)$/ ; if ( $2 > 500) { print "$1 $2\n" }'

Profile elements

The following can be used in a .zshrc or equivalent

Dynamic Terminal Window Titles
case $TERM in 
        vt100*) 
        precmd () {print -Pn "\e]0;%n@%m: %~\a"} 
        ;; 
esac
Fancy prompt
PS1="$(print '%{\e[;31m%}%n%{\e[;0m%}@%{\e[;30m%}%m%{\e[0;37m%}[%~]%{\e[0m%}% ')"
Fancy aliases
alias yak="yak -Pn \"\e]0;.o0 yak 0o.\a\" ; ssh yak"

Network Connectivity Notifications

#!/bin/sh
# Ping an IP and do sound effects when our connection state changes.
# Get PlayBufferedSoundFile here: http://www.snoize.com/Code/PlayBufferedSoundFile.tar.gz
target='12.116.25.9'
status='online'
oldstatus='online'
while true
 now=`date`
 echo "$now = $status"
 if [[ $status != $oldstatus ]]
  then if [[ $status == "online" ]] 
   then ~/bin/PlayBufferedSoundFile ~/Documents/sounds/frostnova.aif
   else ~/bin/PlayBufferedSoundFile ~/Documents/sounds/cs.aif
  fi
 fi
 oldstatus="$status"
 sleep 3
 do ping -t1 -c1 -n $target>/dev/null 2>&1 && status="online"||status="offline"
done
.

AppleScript

Droplet

on open some_items 
       
 display dialog "Where to, hoss?" buttons {"docroot", "bits", "public_html"} default button "bits" 
 set theButton to the button returned of the result 
       
 if theButton = "bits" then 
  set dest to "andre@dreness.com:/home/websites/dreness/bits" 
 else if theButton = "docroot" then 
  set dest to "andre@dreness.com:/home/websites/dreness" 
 else if theButton = "public_html" then 
  set dest to "andre@dreness.com:~/public_html" 
 else 
  display dialog "no valid choices!" 
 end if 
       
 repeat with this_item in some_items 
  try 
   do shell script "scp " & quoted form of the POSIX path of this_item & " " & quoted form of dest 
  end try 
 end repeat 
end open

Perl

QTSS Stats

#!/usr/bin/perl -w 
# This is a tiny script to parse QTSS's server_status to provide a running output of 
# statistics that is extremely low overhead. Refresh is every 10 seconds, 
# since that is how often the server_status file is updated by the server 
# 8/2/03, dre@mac.com 
#full path of server_status file 
$statsfile = "/Library/QuickTimeStreaming/Logs/server_status"; 
while (1) { 
open(STATS, "$statsfile");  
while ($line = <STATS>) {
if ($line =~ /<key>(.*?)<\/key>/) { 
$storein = "$1"; 
} elsif ($storein) { 
$line =~ /<string>(.*?)<\/string>/; 
$dss_stats{"$storein"} = "$1"; 
undef $storein; 
}; 
}; 
print `date`; 
print "Total RTP connections: $dss_stats{qtssRTPSvrTotalConn}\n"; 
print "Current RTSP / HTTP connections: $dss_stats{qtssRTSPHTTPCurrentSessionCount}\n"; 
print "Current RTP connections: $dss_stats{qtssRTPSvrCurConn}\n"; 
$rtp_kbits = sprintf("%.2f", ($dss_stats{qtssRTPSvrCurBandwidth} / 1000)); 
$rtp_mbits = sprintf("%.2f", ($rtp_kbits / 1000)); 
print "Current RTP bandwidth $rtp_kbits Kbit/s ($rtp_mbits Mbit/s)\n"; 
print "Current RTP packets: $dss_stats{qtssRTPSvrCurPackets}\n"; 
$rtp_bytes = $dss_stats{qtssRTPSvrTotalBytes}; 
$rtp_megs = ($dss_stats{qtssRTPSvrTotalBytes} / 1024 / 1024); 
$rtp_megs = sprintf("%.2f", $rtp_megs); 
$rtp_gigs = ($rtp_megs / 1024); 
$rtp_gigs = sprintf("%.2f", $rtp_gigs); 
print "Total RTP bytes transfered: $rtp_bytes ($rtp_megs MB, $rtp_gigs GB)\n"; 
close(STATS); 
print "\n"; 
sleep 10; 
};

SSH Tunnel Watcher

#!/usr/bin/perl
if ( `ps x | grep "ssh -L 2501:local:25" | grep -v grep` ) { 
        print "local mail ssh tunnel running okay! n"; 
        } else { 
        print "reloading... n"; 
        system("ssh -L 2501:local:25 -f -N local"); 
};
if ( `ps x | grep "ssh -L 2500:local:2501" | grep -v grep` ) { 
        print "public mail ssh tunnel running okay! n"; 
        } else { 
        print "reloading... n"; 
        system("ssh -L 2500:local:2501 -f -N -g local"); 
};