35
BASH Scripting Intro and Variables

BASH Scripting Intro and Variables. Objectives Introduce Unix script writing including: – introducing variables – locality – basic I/O Introduce script

Embed Size (px)

Citation preview

BASH Scripting

Intro and Variables

Objectives

• Introduce Unix script writing including:– introducing variables – locality– basic I/O

• Introduce script execution• Introduce the .bash_profile file

Overview• Executing• Variables

– creating/assignment– accessing– list variables (arrays)– exporting– read only– eliminating– predefined

• I/O– read– echo (write)

Example of First Script-bash-3.2$cat helloworld # show contents of scriptecho Hello World!! # display Hello World!! on screen-bash-3.2$. helloworld # execute script (note the period space (. ) prior to

the script name) Hello World!!

Steps for scriptsvi sfile

sfile

. sfile source sfile bash sfile sh sfile ./sfile sfile

chmodsfile

PATH+=:dir

requires execute permission

requires path

Executing a Script

command chmod1

separate shell2

Path set3

. script No No Nosource script No No No

bash script No Yes Nosh script No Yes No./script Yes Yes Noscript Yes Yes Yes

1 – requires execute mode2 – runs in separate shell. Variables set have no affect outside of script even with export but exported variables are exported to sub scripts3 – requires PATH variable to be set to point to current directory (.)

Shell Positional Parameters

Variable Result$0 name of called script$1 $2 … $9

parameter 1, 2,… 9

$# number of parameters$@ values of all parameters using:

“1” “2”, etc (multiple parameters)$* values of all parameters using:

“1 2 etc” (a single parameter)$? return code$$ Process ID (PID)

Parameters are sent by entering values when the shell is called.

Shell Positional Parameters

Variable Result$0 params$1 $2 a b$# 3$@ a b c$? 0$* a b c$$ 13061

Assuming a script called params was called using the parameters a b c:

params a b c

set• Parameters may be set within a script using the set command

– Example: set w x y z will set parameters 1 through 4 to “w” “x” “y” and “z”, even if they were set to values when the shell was called.

If fewer variables were set than were called the “extra” variables are lost– Example:

if a script called paramsset is called using:paramsset a b c d

and inside paramsset is the command: set x y z

x, y, and z are the only values available (“d” is lost)

Variables

• creating– must begin with a character (a-z,A-Z)– may contain alphanumeric characters (a-z,A-Z,0-9)

and the underscore character(_)– case sensitive, thus Ron is different than ron

• assignment– var=val NOTE: no spaces surrounding =– var=“space delimited vals”

Viewing Variables Set

• Show all variables set: set

Variables

• accessing– $var - shows value of variable– ${var}othertext – ensures that var is the

substitution variable (not varothertext)– ${var-val} - shows value of var if defined

otherwise uses val (if val includes spaces, it must be enclosed in “; if val is a command must be inclosed in `)

Variable ExamplesDescription Command

create a variable using a value or the output from a command

myvar=“Fri Oct 19 11:31:16 EDT 2007”or myvar=`date`

shows variable echo $myvar

shows variable echo ${myvar-`date`}

clear variable myvar=

shows a blank line echo ${myvar-`date`}

delete variable unset myvar

shows current date (myvar no longer exists)

echo ${myvar-`date`}

Please note the ` is called a grave accent and is NOT a single quote. It is located above the tab key, on the same key as the tilde ~. Do not confuse this with the single quote (next to the Enter key).

More Variable Substitution

• ${var:opval}

op Purpose Description

= Initializing var to val if it is not initialized

if var is not set, sets var to the word val

+ Test for existence of a variable

If var exists and is not null, return val else return null

? Catching and terminating scripts with undefined or unitialized variables

if var has been set return its value, else val message displayed script terminates

Variable substitution examplesVariables set Substitution Result

val=Ron val2=Sueval:=$val2 Ronval:+$val2 Sueval:?$val2 Ron

val= val2=Suei.e. val has no value

val:=val2 Sueval:+val2 Sueval:?val2 variablesub: line 22:

val: Sue

val2=Suei.e. val never set

val:=val2 Sueval:+val2val:?val2 variablesub: line 22:

val: Sue

Variable pattern matching# and %

${variable#pattern} If the pattern matches the beginning of the variable's value, delete the shortest part that matches and return the rest.

${variable##pattern} If the pattern matches the beginning of the variable's value, delete the longest part that matches and return the rest.

${variable%pattern} If the pattern matches the end of the variable's value, delete the shortest part that matches and return the rest.

${variable%%pattern} If the pattern matches the end of the variable's value, delete the longest part that matches and return the rest.

Variable pattern matching# and %

• Pattern-matching operators are useful for stripping off components of pathnames, such as directory prefixes and filename suffixes.

• An easy way to remember the usage is to think of how we write percents. For example 75% the number (#) 75 precedes and the percent sign (%) follows

• Doubling the symbol (## or %% indicates repeated deletions until pattern is found.

# and % ExamplesAn example that shows how all of the operators may be

used. Assume that the variable path has the value: /home/student/project/Class.Name.java

Expression Result Comments

$path /home/student/project/Class.Name.java

${path##/*/} Class.Name.java deletes all directories until file dot (.) is found

${path#/*/} student/project/Class.Name.java deletes first directory only

${path%%.*} /home/student/project/Class deletes all dot (.) filenames from right

${path%.*} /home/student/project/Class.Name deletes first occurrence from right

Variables

• Exporting: Variables are considered “local” to the script, that is, a variable used in a particular script has no affect outside of that particular script. The export command will allow the variable to be used in a child script. A child script is a script that has been started from another script (the parent). It is important to note that exporting only goes from parent to child not from child to parent.

Variable exportingParentScript:

name1=Ronname2=Sueexport name2sh ChildScriptecho $name2 ChildScript:

echo $name1echo $name2name2=Bob

Script Command Result Reason

ChildScript echo $name1 blank name1 is local to ParentScript and not exported

ChildScript echo $name2 Sue name2 is defined and exported from ParentScript

ParentScript echo $name2 Sue name2 cannot be transferred to ParentScript from ChildScript so ParentScript’s name2 is unchanged

readonly Variables

• declaring a value readonly makes it a constant, for example:

name=Ron

readonly name

echo $name

name=Sue

echo $name

results in the following error:readonly: line 4: name: readonly variable

eliminating Variables

– var= simply removes the value (sets it to null) of the variable NOT the variable itself

– unset var removes the variable altogether

predefined Variables (selected)Variable Description

HOME home directory

IFS Internal field separator

PATH Directories to search for commands and scripts

CDPATH Directories to use with the cd command

PS1 Prompt to be used

PS2 Prompt to be used if the command is continued on multiple lines

PS3 Prompt string for select statements

predefined Variables (selected)Variable Description

MAIL file that receives your mail

MAILCHECK Interval used by the shell to check for mail (default 600 sec)

SHELL

TERM

TZ

PS1, PS2 variables (selected*)Value Description

\a ASCII bell (the beep)

\A, t, \T Current Time in HH:MM (24 hours), HH:MM:SS (24 and 12 hours)

\D{format} Date in format (see http://linux.die.net/man/3/strftime)

\h, \H hostname, complete hostname

\s Name of shell

\u Username

\v Version

\w Current directory

Example: PS1=‘\s-\v$’ shows -bash-3.2$, which is the current default.

*For a complete list of variables, see pages 365-366 in Unix in a Nutshell

I/O

• read : allow the user to enter data into a variable from standard input (keyboard)

• echo : displays contents onto standard output (display)

.bash_profile

• A user may have a hidden file called .bash_profile• This file is really a script that is automatically called

when one logs in to the machine.• .bash_profile is responsible for setting up the Unix

environment specifically for you. The Windows/DOS equivalents for this was autoexec.bat and config.sys

• A key variable in the .bash_profile is the PATH variable. This variable provides Unix with a search path for locating files

What to do if you don’t have a .bash_profile file.

• Search in your home directory for the .bash_profile file using: ls –a .bash_profile

• If it does not exist, copy the /etc/profile file to your home directory renaming it .bash_profile

This file is extremely important, so be sure to save a copy of it, prior to altering it, in order to restore it, should things go wrong.

Modifying the PATH variable

• To modify the PATH variable to add a directory to the existing PATH use the following commands:PATH+=“:newpath”

• In Unix the colon (:) is a separator between different paths. In Windows/DOS the separator is a semi-colon (;).

Be extremely careful in modifying the PATH, as many commands will no longer work if the PATH is corrupted.

I/O (read)

• format: read [options] var1[ var2…]• Options (selected)

– -p ‘string’ : prompt with a string (no need to use an echo for prompting)

– -s : hide input, good for password entries

– -t seconds : Wait for input specified number of seconds, if time expires do not set variables

I/O (echo)

• format: echo [options] [strings]• Options:

– -e : Enable escape character interpretation (see next slide)

– -n : Do not append a newline to the output (useful for concatenating strings or when prompting for a read and read to take place on same line as prompt

– -E : disable interpretation of escape characters

Prompt and Read Examples-bash-3.2$cat helloworld #read name from keyboardread -p 'Enter name: ' name# print out hello worldecho Hello $name!!-bash-3.2$. helloworldEnter name: Sue Hello Sue!!

-bash-3.2$cat helloworld #prompt for nameecho Enter Name:#read name from keyboardread name# print out hello worldecho Hello $name!!-bash-3.2$. helloworld Enter Name:SoumyaroopHello Soumyaroop!!

Escape Characters

• the escape character, a backslash (\), allows a different interpretation for the following selected characters:– \a : Audible alert– \b : backspace– \c : continue on same line (same as –n option)– \e : escape character– \f : form feed– \n : newline– \r : carriage return (on some systems \r\n are both

required for a new line)– \t : horizontal tab

Review

• Introduced Unix script writing including:– introducing variables – locality– basic I/O

• Introduced script execution• Introduced the .bash_profile file

BASH Scripting

Intro and Variables