shellScript.ref
mail.
use /usr/ucb/Mail, exist in linux and solaris
cat FILE | Mail -s "subject line" tho01@cs
(linux mail does not support -s subject option, while solaris will not use the
first line of the message that has 'Subject: bla' in it as the subject.)
wisdom from Mohit:
set absolute path at the beginning of the script.
this way, no need to define commands with full path.
The only other issue is, same command, such as awk, maybe in multiple places,
which is not really same (linux awk is solaris nawk). Path sequence need to
be assigned carefully for such commands. In a very heterogeneous platform,
maybe hard and hard path prefered...
---
echo $PATH | tr ':' '\012'
\012 is the octal value for linefeed, note that \015, CR, will not work in unix.
---
$NUM = `expr 10 + 10`
$NUM = `expr 10 \* 10`
$NUM = `expr 10 \/ 10`
--------
LD_PRELOAD_OPTS=...
This environemnt will allow specific library to be "preloaded", before LD_LIBRARY_PATH modules get loaded. This way, program that has specific requirements for libs but may otherwise conflict with studd in LD_LIBRARY_PATH can be preferentially loaded first, thus used first and resolve incomptabilities issues.
-------
emulating main:
have fn called
main()
{ ... }
then at end of file, call it as
main $*
$* = all arguments
The actual calling of the fn does not need () before args.
fn really become mini shell scripts w/in the script.
----
for programs that insist of having a terminal attached to it,
use this in the shell script, and the whole script will seems to have a terminal attached to it (don't know what is implication of stdin).
exec 0 /dev/null
done
Also, do not put quotes around $List in the line of the for loop, or the whole thing will be considered a
single entity, instead of being space delimited.
----
#.profile from db2profile for setting up path
# eg use after declaration:
# AddtoString PATH /usr/local/bin
#
# Function to avoid repetitive environment variable entries
#
# addition by Tin, add only if dir actually exist
#
AddtoString()
{
var=$1
addme=$2
if [ -d $2 ]; then
awkval='$1 != "'${addme?}'"{print $0}'
newval=`eval /usr/bin/echo \\${$var} | /usr/bin/awk "${awkval?}" RS=:`
eval ${var?}=`/usr/bin/echo $newval | /usr/bin/sed 's/ /:/g'`:${addme?}
unset var addme awkval newval
fi
}
---
Not really shell script, but commands
================================================================================
csh craps:
set path = ( $path /bin /usr/local/bin /usr/bin /usr/bin/X11 ~/bin /sbin /usr/sbin . )
##---->>> don't use $PATH above, it must be lower case $path in the parenthesis.
##---->>> or else it will consider the colon delimited list as a unit and path won't work,
##---->>> even when displayed correctly!! another reason why csh is bad!! =)
setenv PATH "${PATH}:${AMGEN_HOME}/bin"
###--->>> above works, ${PATH} is the right thing to use. (it seems braces {} are required around var name.
##-->> $path is a space delimited list
##-->> $PATH is a colon delimited list
##-->> setenv expects a colon delimited list
##-->> set expects a space delimited list
setenv DISPLAY hostname:1
unsetenv DISPLAY # undo setenv
set ...
unset ... # undo set
CSH variable evaluation.
If a variable is not defined, trying to access it will give an error.
I guess it is like C programming language after all.
sh will just print blank, which I think is easier to deal with in shell script.
But anyway, in CSH, to guard against such error, need to test the variable
being defined before using it. eg
if ($?TRACE_LOG) then
setenv TRACE_LOG "$TRACE_LOG openeye_processed"
else
setenv TRACE_LOG "openeye_processed"
endif
if ($?MANPATH) then
setenv MANPATH "${MANPATH}:/usr/share/man:/usr/man:/usr/local/man"
else
setenv MANPATH "/usr/share/man:/usr/man:/usr/local/man"
endif
These kind of check should be done for things like LD_LIBRARY_PATH, etc.
There is probably an easier way, using :q or something
csh if statement, string comparison
set machine = `hostname`
if !( ( ${machine} == "firth" ) || ( ${machine} == "firth.amgen.com" ) ) then
echo "no Firth here... do work"
else
echo "it is Firth here"
endif
http://www.unet.univie.ac.at/aix/aixuser/usrosdev/c_shell_cmds.htm#A279911bb ::
C Shell Expressions and Operators
Operator What it Means
() change precedence
~ complement
! negation
*/ % multiply, divide, modulo
+ - add, subtract
<< > > left shift, right shift
<= >= < > relational operators
== != =~ !~ string comparison/pattern matching
& bitwise "and"
^ bitwise "exclusive or"
| bitwise "inclusive or"
&& logical "and"
|| logical "or"
Things to have in .cshrc ::
http://mail.hudat.com/~ken/help/unix/.cshrc
#alias ins2path 'if ("$path:q" !~ *"\!$"* ) set path=( \!$ $path )'
#alias add2path 'if ("$path:q" !~ *"\!$"* ) set path=( $path \!$ )'
add2path ${JAVA_HOME}/bin
I/O redirection
cat foo >& bar # >& = stdout + stderr (sh use 2>&1 at the end)
cat foo |& tee bar # | instead of >, otherwise same as above.