www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
Agenda
What is a shell? A shell script?
Introduction to bash
Running Commands
Applied Shell Programming www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
What is a shell?
www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
What is a shell?
www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
What is a shell?
www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
What is a shell?
INPUT shell
OUTPUT ERROR www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
What is a shell?
Any Program
But there are a few popular shells… www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
Bourne Shells
/bin/sh
/bin/bash
“Bourne-Again Shell”
Steve Bourne www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
Other Common Shells
C Shell ( /bin/csh )
Turbo C Shell ( /bin/tcsh )
Korn Shell ( /bin/ksh ) www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
An aside: What do I mean by /bin ?
C Shell ( /bin/csh )
Turbo C Shell ( /bin/tcsh )
Korn Shell ( /bin/ksh ) www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
An aside: What do I mean by /bin ?
/bin, /usr/bin, /usr/local/bin
/sbin, /usr/sbin, /usr/local/sbin
/tmp
/dev
/home/borwicjh www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
What is a Shell Script?
A Text File
With Instructions
Executable www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
What is a Shell Script?
% cat > hello.sh <<MY_PROGRAM
#!/bin/sh echo ‘Hello, world’
MY_PROGRAM
% chmod +x hello.sh
% ./hello.sh
Hello, world www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
What is a Shell Script? A Text File
% cat > hello.sh <<MY_PROGRAM
#!/bin/sh echo ‘Hello, world’
MY_PROGRAM
% chmod +x hello.sh
% ./hello.sh
Hello, world www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
An aside: Redirection
cat > /tmp/myfile
cat >> /tmp/myfile
cat 2> /tmp/myerr
cat < /tmp/myinput
cat <<INPUT
Some input
INPUT
cat > /tmp/x 2>&1
INPUT
0
OUTPUT
1 env
ERROR
2 www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
What is a Shell Script? How To Run
% cat > hello.sh <<MY_PROGRAM
#!/bin/sh echo ‘Hello, world’
MY_PROGRAM
% chmod +x hello.sh
% ./hello.sh
Hello, world www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
What is a Shell Script? What To Do
% cat > hello.sh <<MY_PROGRAM
#!/bin/sh echo ‘Hello, world’
MY_PROGRAM
% chmod +x hello.sh
% ./hello.sh
Hello, world www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
What is a Shell Script? Executable
% cat > hello.sh <<MY_PROGRAM
#!/bin/sh echo ‘Hello, world’
MY_PROGRAM
% chmod +x hello.sh
% ./hello.sh
Hello, world www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
What is a Shell Script? Running it
% cat > hello.sh <<MY_PROGRAM
#!/bin/sh echo ‘Hello, world’
MY_PROGRAM
% chmod +x hello.sh
% ./hello.sh
Hello, world www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
Finding the program: PATH
% ./hello.sh
echo vs. /usr/bin/echo
% echo $PATH
/bin:/usr/bin:/usr/local/bin:
/home/borwicjh/bin
% which echo
/usr/bin/echo www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
Variables and the Environment
% hello.sh
bash: hello.sh: Command not found
% PATH=“$PATH:.”
% hello.sh
Hello, world www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
An aside: Quoting
% echo ‘ $USER ’
$USER
% echo “ $USER ” borwicjh
% echo “ \” ”
”
% echo “deacnet \\ sct” deacnet\sct
% echo ‘ \” ’
\” www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
Variables and the Environment
% env
[…variables passed to sub-programs…]
% NEW_VAR=“Yes”
% echo $NEW_VAR
Yes
% env
[…PATH but not NEW_VAR…]
% export NEW_VAR
% env
[…PATH and NEW_VAR…] www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
Welcome to Shell Scripting!
www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
How to Learn
man
man bash
man cat
man man
man –k
man –k manual
Learning the Bash Shell , 2 nd Ed.
“Bash Reference” Cards
http://www.tldp.org/LDP/abs/html/ www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
bash www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
Continuing Lines: \
% echo This \
Is \
A \
Very \
Long \
Command Line
This Is A Very Long Command Line
% www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
Exit Status
$?
0 is True
% ls /does/not/exist
% echo $?
1
% echo $?
0 www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
Exit Status: exit
% cat > test.sh <<_TEST_ exit 3
_TEST_
% chmod +x test.sh
% ./test.sh
% echo $?
3 www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
Logic: test
% test 1 -lt 10
% echo $?
0
% test 1 == 10
% echo $?
1 www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
Logic: test
test
[ ]
[ 1 –lt 10 ]
[[ ]]
[[ “this string” =~ “this” ]]
(( ))
(( 1 < 10 )) www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
Logic: test
[ -f /etc/passwd ]
[ ! –f /etc/passwd ]
[ -f /etc/passwd –a –f /etc/shadow ]
[ -f /etc/passwd –o –f /etc/shadow ] www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
An aside: $(( )) for Math
% echo $(( 1 + 2 ))
3
% echo $(( 2 * 3 ))
6
% echo $(( 1 / 3 ))
0 www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
Logic: if if something then
:
# “elif” a contraction of “else if”: elif something-else then
: else then fi
: www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
Logic: if if [ $USER –eq “borwicjh” ] then
:
# “elif” a contraction of “else if”: elif ls /etc/oratab then
: else then fi
: www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
Logic: if
# see if a file exists if [ -e /etc/passwd ] then echo “/etc/passwd exists” else echo “/etc/passwd not found!” fi www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
Logic: for for i in 1 2 3 do echo $i done www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
Logic: for for i in /* do echo “Listing $i:” ls -l $i read done www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
Logic: for for i in /* do echo “Listing $i:” ls -l $i read done www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
Logic: for for i in /* do echo “Listing $i:” ls -l $i read done www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
Logic: C-style for for (( expr1 ; expr2 ; expr3 )) do list done www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
Logic: C-style for
LIMIT=10 for (( a=1 ; a<=LIMIT ; a++ )) do echo –n “$a ” done www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
Logic: while while something do
: done www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
Logic: while a=0; LIMIT=10 while [ "$a" -lt "$LIMIT" ] do echo -n "$a ” a=$(( a + 1 )) done www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
Counters
COUNTER=0 while [ -e “$FILE.COUNTER” ] do
COUNTER=$(( COUNTER + 1)) done
Note: race condition www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
Reusing Code: “Sourcing”
% cat > /path/to/my/passwords <<_PW_
FTP_USER=“sct”
_PW_
% echo $FTP_USER
% .
/path/to/my/passwords
% echo $FTP_USER sct
% www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
Variable Manipulation
% FILEPATH=/path/to/my/output.lis
% echo $FILEPATH
/path/to/my/output.lis
% echo ${FILEPATH %.lis
}
/path/to/my/output
% echo ${FILEPATH #*/ } path/to/my/output.lis
% echo ${FILEPATH ##*/ } output.lis
www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
It takes a long time to become a bash guru… www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
Reasons for Running Programs
Check Return Code
$?
Get Job Output
OUTPUT=`echo “Hello”`
OUTPUT=$(echo “Hello”)
Send Output Somewhere
Redirection: < , >
Pipes www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
Pipes
Lots of Little Tools echo “Hello” | \ wc -c
INPUT
0
OUTPUT
1
A Pipe!
echo
ERROR
2
INPUT
0 wc
OUTPUT
1
ERROR
2 www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
Email Notification
% echo “Message” | \ mail –s “Here’s your message” \ borwicjh@wfu.edu
www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
Dates
% DATESTRING=`date +%Y%m%d`
% echo $DATESTRING
20060125
% man date www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
FTP the Hard Way ftp –n –u server.wfu.edu <<_FTP_ user username password put FILE
_FTP_ www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
FTP with wget
wget \ ftp://user:pass@server.wfu.edu/file
wget –r \ ftp://user:pass@server.wfu.edu/dir/ www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
FTP with curl curl –T upload-file \
-u username:password \ ftp://server.wfu.edu/dir/file www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
Searching: grep
% grep rayra /etc/passwd
% grep –r rayra /etc
% grep –r RAYRA /etc
% grep –ri RAYRA /etc
% grep –rli rayra /etc www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
Searching: find
% find /home/borwicjh \
-name ‘*.lis’
[all files matching *.lis]
% find /home/borwicjh \
-mtime -1 –name ‘*.lis’
[*.lis, if modified within 24h]
% man find www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
Searching: locate
% locate .lis
[files with .lis in path]
% locate log
[also finds “/var/log/messages”] www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
Make Your Life Easier
TAB completion
Control+R
history
cd -
Study a UNIX Editor www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
pushd/popd
% cd /tmp
% pushd /var/log
/var/log /tmp
% cd ..
% pwd
/var
% popd
/tmp www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
Monitoring processes
ps
ps –ef
ps –u oracle
ps –C sshd
man ps www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
“ DOS” Mode Files
#!/usr/bin/bash^M
FTP transfer in ASCII, or
dos2unix infile > outfile www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
sqlplus
JOB=“ZZZTEST”
PARAMS=“ZZZTEST_PARAMS”
PARAMS_USER=“BORWICJH” sqlplus $BANNER_USER/$BANNER_PW << _EOF_ set serveroutput on set sqlprompt ""
EXECUTE WF_SATURN.FZ_Get_Parameters('$JOB',
'$PARAMS', '$PARAMS_USER');
_EOF_ www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
sqlplus sqlplus $USER/$PASS @$FILE_SQL \
$ARG1 $ARG2 $ARG3 if [ $? –ne 0 ] then exit 1 fi if [ -e /file/sql/should/create ] then
[…use SQL-created file…] fi
Ask Amy Lamy! www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
Passing Arguments
% cat > test.sh <<_TEST_ echo “Your name is \ $1 \ $2 ”
_TEST_
% chmod +x test.sh
% ./test.sh John Borwick ignorethis
Your name is John Borwick www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
INB Job Submission Template
$1 : user ID
$2 : password
$3 : one-up number
$4 : process name
$5 : printer name
% /path/to/your/script $UI $PW \
$ONE_UP $JOB $PRNT www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
Scheduling Jobs
% crontab -l
0 0 * * * daily-midnight-job.sh
0 * * * * hourly-job.sh
* * * * * every-minute.sh
0 1 * * 0 1AM-on-sunday.sh
% EDITOR=vi crontab –e
% man 5 crontab www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt
Other Questions?
Shells and Shell Scripts
bash
Running Commands
bash and Banner in Practice www.wfu.edu/~borwicjh/presentations/UNIX%20Shell-Scripting%20Basics.ppt