27
bash Execution Control COMP2101 Fall 2019

bash Execution Control - GitHub Pages · The bash shell is just a program stored in the file /bin/bash When you tell the operating system to run that program, it creates an instance

  • Upload
    others

  • View
    9

  • Download
    0

Embed Size (px)

Citation preview

Page 1: bash Execution Control - GitHub Pages · The bash shell is just a program stored in the file /bin/bash When you tell the operating system to run that program, it creates an instance

bash Execution ControlCOMP2101Fall 2019

Page 2: bash Execution Control - GitHub Pages · The bash shell is just a program stored in the file /bin/bash When you tell the operating system to run that program, it creates an instance

Scripting Environment

The process environment

Shell environment files

Environment variables

Page 3: bash Execution Control - GitHub Pages · The bash shell is just a program stored in the file /bin/bash When you tell the operating system to run that program, it creates an instance

Shell Process

The bash shell is just a program stored in the file /bin/bash

When you tell the operating system to run that program, it creates an instance of the program known as a process

A process is a chunk of code and data that reside in RAM and has at least one thread of control

Bash is single-threaded and does things sequentially (think turn-based games like chess)

Page 4: bash Execution Control - GitHub Pages · The bash shell is just a program stored in the file /bin/bash When you tell the operating system to run that program, it creates an instance

Shell Process

Processes are started by other processes when they fork

Processes inherit their environment from the process that started them - the new process is called the child process and the original process is called the parent process

Programs often look for environment ( sometimes called startup ) files to modify their inherited operating environment and provide configuration of the program

Page 5: bash Execution Control - GitHub Pages · The bash shell is just a program stored in the file /bin/bash When you tell the operating system to run that program, it creates an instance

Environment Variables

Variables are only usable by the process that creates them

Processes have a way to store variables in their environment, which is a special part of process memory

Environment variables get copied to child processes

Environment variables are normally named using capital letters and numbers only

Variables can be put into, or taken out of, the environment

export VARNAME export VARNAME=“Data” export -n VARNAME

Page 6: bash Execution Control - GitHub Pages · The bash shell is just a program stored in the file /bin/bash When you tell the operating system to run that program, it creates an instance

Lab 3 - checkMYVAR.sh

Page 7: bash Execution Control - GitHub Pages · The bash shell is just a program stored in the file /bin/bash When you tell the operating system to run that program, it creates an instance

Login Shell

When you login to the system, the program that allowed you to login runs whatever shell program is configured for your login account, typically bash for Linux users

The first shell process started when you log onto a Linux system is called your login shell

It is used to start other programs, manage files, and observe and control the system

If you start additional shells such as in terminal windows or by running scripts, they are called interactive non-login shells

When your login shell process ends, you are logged out

Page 8: bash Execution Control - GitHub Pages · The bash shell is just a program stored in the file /bin/bash When you tell the operating system to run that program, it creates an instance

bash Environment Files

Environment files are shell scripts that run commands to configure programs, set variables, manipulate files, and/or send messages

Each user's environment files are kept in their home directory, and users can create, modify, or remove them

bash runs /etc/profile before running user-specific environment script files, in order to provide a global minimum configuration for all bash users

bash looks for ~/.bash_profile, ~/.bash_login, ~/.profile and ~/.bash_logout for login shells

bash looks for ~/.bashrc for interactive non-login shells

Page 9: bash Execution Control - GitHub Pages · The bash shell is just a program stored in the file /bin/bash When you tell the operating system to run that program, it creates an instance

Lab 3 - login-welcome.sh

Page 10: bash Execution Control - GitHub Pages · The bash shell is just a program stored in the file /bin/bash When you tell the operating system to run that program, it creates an instance

Predefined Variables

bash provides a number of variables containing useful information, the env command will display them

Some are inherited from ancestor processes (e.g. login, getty, init)

More are often set up by user environment files to customize the user experience

bash also has some special variables that dynamically retrieve data for realtime uses

Page 11: bash Execution Control - GitHub Pages · The bash shell is just a program stored in the file /bin/bash When you tell the operating system to run that program, it creates an instance

Special Variables

$ - current process id

# - number of parameters on the command line of a script

0-n - command line parameters

RANDOM - a random 15-bit integer

REPLY - default variable name for the read command

? - exit status of most recent command, zero means success

Page 12: bash Execution Control - GitHub Pages · The bash shell is just a program stored in the file /bin/bash When you tell the operating system to run that program, it creates an instance

Test Expressions

Testing data

Testing files

Page 13: bash Execution Control - GitHub Pages · The bash shell is just a program stored in the file /bin/bash When you tell the operating system to run that program, it creates an instance

Test Command

The test command evaluates an expression and sets its exit status based on whether the expression evaluates as true or false

The test command can also be run using the [ alias, which uses a ] to mark the end of the expression on the command line

Multiple expressions can be evaluated by putting -a (and) or -o (or) between expressions

test -d /etc && echo "/etc exists" [ -d /etc ] && echo "/etc exists" [ -d /etc -a -r /etc ] && echo "/etc exists and is readable"

Page 14: bash Execution Control - GitHub Pages · The bash shell is just a program stored in the file /bin/bash When you tell the operating system to run that program, it creates an instance

File Testing

The following are commonly used file tests, although there are more not included here

-e filename : filename exists as any kind of filesystem object

-f filename : filename exists and is a regular file (can hold data)

-d filename : filename exists and is a directory

-r filename : filename exists and is readable by whoever is doing the test

-w filename : filename exists and is writable by whoever is doing the test

-h filename : filename exists and is a symbolic link

-s filename : filename exists and is not empty

Putting ! in front of the test operator ( the letter with a dash in front of it ) inverts the test

Page 15: bash Execution Control - GitHub Pages · The bash shell is just a program stored in the file /bin/bash When you tell the operating system to run that program, it creates an instance

Test Expressions

Test is generally used to either test data (usually in variables), or to test file attributes

Test expressions may test single things for some characteristic, or attribute - this is known as a unary test

Test expressions may compare two things - this is known as a binary test

Unary test expressions take the form -x thing, where -x is the test operator specifying what kind of test to perform

Binary test expressions take the form thing1 operator thing2 where operator tells the test command what kind of comparison to perform

Putting ! in front of the test operator inverts the test

Page 16: bash Execution Control - GitHub Pages · The bash shell is just a program stored in the file /bin/bash When you tell the operating system to run that program, it creates an instance

Unary Operators

The only unary operator that checks a variable is -v variablename which is true if the variable exists and false if it doesn't

Text strings can be tested to see if they have no text in them with -z "sometext" or have some text with -n "sometext"

Since it would make no sense to do such a test on literal text, it is easy to see that we would use some kind of dynamic data with the -n or -z tests

Page 17: bash Execution Control - GitHub Pages · The bash shell is just a program stored in the file /bin/bash When you tell the operating system to run that program, it creates an instance

Binary Operators For Text

Text strings can be compared using the following operators

"string1" = "string2" is true if the two strings are identical

"string1" != "string2" is true if the two strings are not identical

Strings consisting of digits are compared as text by these operators, not as numbers

Page 18: bash Execution Control - GitHub Pages · The bash shell is just a program stored in the file /bin/bash When you tell the operating system to run that program, it creates an instance

Binary Operators For Numbers

To compare numbers, there are several binary test operators available

X -eq Y is true if X and Y are the same number

X -ne Y is true if X and Y are not the same number

X -lt Y is true if X is numerically less than Y

X -gt Y is true if X is numerically more than Y

X -le Y is true if X is numerically less than Y or X is equal to Y

X -ge Y is true if X is numerically more than Y or X is equal to Y

Page 19: bash Execution Control - GitHub Pages · The bash shell is just a program stored in the file /bin/bash When you tell the operating system to run that program, it creates an instance

Testing Command Success

When a child process exits, the shell can retrieve the child's exit status from the special variable ?

It can be used in a test expression when it matters if a command has errors

An exit status of zero means success

Scripts can set their exit status with the exit command e.g. exit 3

grep -q dennis /etc/passwd if [ $? -ne 0 ]; then echo "Adding user" sudo adduser dennis else echo "user already exists" fi

Page 20: bash Execution Control - GitHub Pages · The bash shell is just a program stored in the file /bin/bash When you tell the operating system to run that program, it creates an instance

Lab 3 - tests.sh

Page 21: bash Execution Control - GitHub Pages · The bash shell is just a program stored in the file /bin/bash When you tell the operating system to run that program, it creates an instance

Conditional Script Blocks

Running multiple commands based on a test - using if

Running multiple commands multiple times - looping with while

Page 22: bash Execution Control - GitHub Pages · The bash shell is just a program stored in the file /bin/bash When you tell the operating system to run that program, it creates an instance

Bash Execution Control

Scripts commonly can evaluate situations and make simple decisions about actions to take

Simple evaluations and actions can be accomplished using && and ||

Complex evaluations and multi-step actions are better handled using more sophisticated execution control commands

Regardless of the complexity of a test, the resulting action command(s) may need to be run more than once, in a loop

We may have multiple data items on which we need to perform one or more commands, also in a loop

Page 23: bash Execution Control - GitHub Pages · The bash shell is just a program stored in the file /bin/bash When you tell the operating system to run that program, it creates an instance

Conditional Script Block Execution

A list of action commands can be run, or not run, based on the success or failure of a testing command list

The test command can evaluate expressions, so it is the most common command for the testlist

An alternate testlist can be specified using elif, and you can use as many alternate testlist/actionlist elifs as necessary

A default actionlist to run if no testlists are successful can be included by using else

if testlist; then actionlist elif testlist; then actionlist else actionlist fi

if [ expr ]; then actionlist fi

Page 24: bash Execution Control - GitHub Pages · The bash shell is just a program stored in the file /bin/bash When you tell the operating system to run that program, it creates an instance

Lab 3 - passwordguesser.sh

Page 25: bash Execution Control - GitHub Pages · The bash shell is just a program stored in the file /bin/bash When you tell the operating system to run that program, it creates an instance

Script Block Looping

An action list can be executed repeatedly (known as a loop) based on the success or failure of a testlist using the while command

The break or continue commands can be used in the action list to get out of a loop early

while testlist; do actionlist done

• break jumps to the done command and continues the script past the loop

• continue jumps back to the while command to redo the testing list

Page 26: bash Execution Control - GitHub Pages · The bash shell is just a program stored in the file /bin/bash When you tell the operating system to run that program, it creates an instance

Lab 3 - guessinggame.sh

Page 27: bash Execution Control - GitHub Pages · The bash shell is just a program stored in the file /bin/bash When you tell the operating system to run that program, it creates an instance

Show me your work to get the marks for it