Beginner's Introduction to Shell Script: PART 1
Beginner's Introduction to Shell Script:PART 2
1. Beyond the Basics
Builtin variables:
variables affecting bash script behavior
 
$BASH 
The path to the Bash binary itself
 
 
$BASH_ENV 
An environmental variable pointing to a Bash startup file to be read when a script is invoked 
 
$BASH_SUBSHELL 
A variable indicating the subshell level. This is a new addition to Bash, version 3.
See Example 21-1 for usage. 
 
$BASHPID 
Process ID of the current instance of Bash. This is not the same as the $$ variable, but it often gives the same result.
 
 
$BASH_VERSION 
The version of Bash installed on the system
 
 
$HOME 
Home directory of the user, usually /home/username 
 
$HOSTNAME 
The hostname command assigns the system host name at bootup in an init script. However, the gethostname() function sets the Bash internal variable$HOSTNAME. 
 
$HOSTTYPE 
host type
Like $MACHTYPE, identifies the system hardware.
 
 
$MACHTYPE 
machine type
Identifies the system hardware.
 
 
$OSTYPE 
operating system type
 
 
$PPID 
The $PPID of a process is the process ID (pid) of its parent process. [2]
Compare this with the pidof command.(pidof -- find the process ID of a running program.)
 
$PROMPT_COMMAND 
A variable holding a command to be executed just before the primary prompt, $PS1 is to be displayed. 
 
$PS1 
This is the main prompt, seen at the command-line. 
 
$PS2 
The secondary prompt, seen when additional input is expected. It displays as ">". 
 
$PS3 
The tertiary prompt, displayed in a select loop. 
 
$PS4 
The quartenary prompt, shown at the beginning of each line of output when invoking a script with the -x option. It displays as "+". 
 
$PWD 
Working directory (directory you are in at the time)
This is the analog to the pwd builtin command.
 
$UID 
User ID number
 The variables $ENV, $LOGNAME, $MAIL, $TERM, $USER, and $USERNAME are not Bash builtins. 
These are, however, often set asenvironmental variables in one of the Bash startup files. $SHELL, the name of the user's login shell, may be set from /etc/passwd or in an "init" script, and it is likewise not a Bash builtin.
sankar@new-host ~]$ echo $LOGNAME
sankar
[sankar@new-host ~]$ echo $SHELL
/bin/bash
[sankar@new-host ~]$ echo $TERM
xterm
Positional Parameters
$?
Exit status of a command, function, or the script itself..
 
$$ 
Process ID (PID) of the script itself. The $$ variable often finds use in scripts to construct "unique" temp file names . This is usually simpler than invoking mktemp.
 
-r readonly
(declare -r var1 works the same as readonly var1) 
   
 -i integer 
 
-a array 
 -f function(s)
-x export
This declares a variable as available for exporting outside the environment of the script itself.
 
-x var=$value 
 NOTE:The declare command can be helpful in identifying variables, environmental..
#!/bin/bash
[sankar@new-host loops]$ chmod +x sfloop.sh
[sankar@new-host loops]$ ./sfloop.sh
Mercury
Venus
Earth
Mars
Jupiter
Saturn
Uranus
Neptune
Pluto
 
Beginner's Introduction to Shell Script:PART 2
1. Beyond the Basics
1.1. Internal Variables:
Builtin variables:
bash$ echo $BASH
/bin/bash
 | 
See Example 21-1 for usage.
bash4$ echo $$
11015
bash4$ echo $BASHPID
11015
bash4$ ps ax | grep bash4
11015 pts/2    R      0:00 bash4
       
 | 
bash$ echo $BASH_VERSION
3.2.25(1)-release
 | 
Like $MACHTYPE, identifies the system hardware.
bash$ echo $HOSTTYPE
i686
 | 
Identifies the system hardware.
bash$ echo $MACHTYPE
i686
 | 
bash$ echo $OSTYPE
linux
 | 
The $PPID of a process is the process ID (pid) of its parent process. [2]
Compare this with the pidof command.(pidof -- find the process ID of a running program.)
This is the analog to the pwd builtin command.
These are, however, often set asenvironmental variables in one of the Bash startup files. $SHELL, the name of the user's login shell, may be set from /etc/passwd or in an "init" script, and it is likewise not a Bash builtin.
sankar@new-host ~]$ echo $LOGNAME
sankar
[sankar@new-host ~]$ echo $SHELL
/bin/bash
[sankar@new-host ~]$ echo $TERM
xterm
- $0, $1, $2, etc.
 - Positional parameters, passed from command line to script, passed to a function, or set to a variable..
 - $#
 - Number of command-line arguments [4] or positional parameters..
 - $*
 - All of the positional parameters, seen as a single word
"$*" must be quoted.  - $@
 - Same as $*, but each parameter is a quoted string, that is, the parameters are passed on intact, without interpretation or expansion. This means, among other things, that each parameter in the argument list is seen as a separate word.
Of course, "$@" should be quoted.  
$?
1.2. Typing variables: declare or typeset
permit modifying the properties of variables. This is a very weak form of the typing.
declare/typeset options:
-r readonly
     declare -r var1=1
     echo "var1 = $var1"   # var1 = 1
declare -i number
# The script will treat subsequent occurrences of "number" as an integer.  
number=3
echo "Number = $number"     # Number = 3
 | 
declare -a indices
 | 
    declare -f function_name
-x export
declare -x var3
 | 
This declares a variable as available for exporting outside the environment of the script itself.
declare -x var3=373
 | 
bash$ declare | grep HOME
HOME=/home/bozo
bash$ zzy=68
bash$ declare | grep zzy
zzy=68
1.3. $RANDOM: generate random integer
   $RANDOM is an internal Bash function (not a constant) that returns a pseudo random integer in the range 0 - 32767. 
1.4. Manipulating Variables
Bash supports a surprising number of string manipulation operations.
2. Loops and Branches
2.1. Loops
for loops This is the basic looping construct.Syntax:for arg in [list] do command(s)... done----------------If do is on same line as for..
for arg  in [list] ; do 
Note: During each pass through the loop, arg takes on the value of each successive variable in the list.
The argument list may contain wild cards.
Example  Simple for loops
1. $vim sfloop.sh
# Listing the planets.
for planet in Mercury Venus Earth Mars Jupiter Saturn Uranus Neptune Pluto
do
  echo $planet  # Each planet on a separate line.
done
:wq
[sankar@new-host loops]$ chmod +x sfloop.sh
[sankar@new-host loops]$ ./sfloop.sh
Mercury
Venus
Earth
Mars
Jupiter
Saturn
Uranus
Neptune
Pluto
Each [list] element may contain multiple parameters. This is useful when processing parameters in groups.
2. Listing all users on the system.
$vim listallusers.sh
2. Listing all users on the system.
$vim listallusers.sh
#!/bin/bash
# userlist.sh
PASSWORD_FILE=/etc/passwd
n=1           # User number
for name in $(awk 'BEGIN{FS=":"}{print $1}' < "$PASSWORD_FILE" )
# Field separator = :    ^^^^^^
# Print first field              ^^^^^^^^
# Get input from password file               ^^^^^^
do
  echo "USER #$n = $name"
  let "n += 1"
done  
# USER #1 = root
# USER #2 = bin
# USER #3 = daemon
# ...
# USER #30 = bozo
exit $?
#  Discussion:
#  ----------
#How is it that an ordinary user, or a script run by same,
#+ can read /etc/passwd? (Hint: Check the /etc/passwd file permissions.)
#  Isn't this a security hole? Why or why not?
:wq
2.3. Testing and Branching
case "$variable" in
"$condition1" ) command... ;;
  "$condition2" ) 
 command... 
 ;;  
esac

- Quoting the variables is not mandatory, since word splitting does not take place.
 
- Each test line ends with a right paren ).
 
- Each condition block ends with a double semicolon ;;.
 
- If a condition tests true, then the associated commands execute and the case block terminates.
 
- The entire case block ends with an esac (case spelled backwards).
 
- 
eg:
$vim machinetype.sh
case $( arch ) in   # $( arch ) returns machine architecture.
  ( i386 ) echo "80386-based machine";;
# ^      ^
  ( i486 ) echo "80486-based machine";;
  ( i586 ) echo "Pentium-based machine";;
  ( i686 ) echo "Pentium2+-based machine";;
  (    * ) echo "Other type of machine";;
esac
:wq
[sankar@new-host loops]$ ./machinetype.sh
Pentium2+-based machine
3. Arithmetic Expansion
Arithmetic expansion provides a powerful tool for performing (integer) arithmetic operations in scripts. 
z=`expr $z + 3`          # The 'expr' command performs the expansion.
Arithmetic expansion with double parentheses, and using let
z=$(($z+3))
z=$((z+3))                                  #  Also correct.
                                            #  Within double parentheses,
                                            #+ parameter dereferencing
                                            #+ is optional.
# $((EXPRESSION)) is arithmetic expansion.  #  Not to be confused with
                                            #+ command substitution.
# You may also use operations within double parentheses without assignment.
  n=0
  echo "n = $n"                             # n = 0
  (( n += 1 ))                              # Increment.
# (( $n += 1 )) is incorrect!
  echo "n = $n"                             # n = 1
let z=z+3
let "z += 3"  #  Quotes permit the use of spaces in variable assignment.
              #  The 'let' operator actually performs arithmetic evaluation,
              #+ rather than expansion.
Beginner's Introduction to Shell Script: PART 3
Beginner's Introduction to Shell Script: PART 4
Beginner's Introduction to Shell Script: PART 5
Beginner's Introduction to Shell Script: PART 6
 
 
No comments:
Post a Comment