Pages

Monday, 12 January 2015

More On BASH Variable

General Assignment and Declaration

[bob in ~] VARIABLE=12

[bob in ~] echo $VARIABLE
12

[bob in ~] VARIABLE=string

[bob in ~] echo $VARIABLE
string
 
Using a declare statement, we can limit the value assign to variables.
 
[bob in ~] declare -i VARIABLE=12

[bob in ~] VARIABLE=string

[bob in ~] echo $VARIABLE
0

[bob in ~] declare -p VARIABLE
declare -i VARIABLE="0"

Constant

[bob in ~] readonly TUX=penguinpower

[bob in ~] TUX=Mickeysoft
bash: TUX: readonly variable

Array Variables 

Access the Values of the Array

bob in ~] ARRAY=(one two three)

[bob in ~] echo ${ARRAY[*]}
one two three

[bob in ~] echo $ARRAY[*]
one[*]

[bob in ~] echo ${ARRAY[2]}
three

[bob in ~] ARRAY[3]=four

[bob in ~] echo ${ARRAY[*]}
one two three four

[bob in ~] echo ${ARRAY[@]}
one two three four


Deleting Array

[bob in ~] unset ARRAY[1]

[bob in ~] echo ${ARRAY[*]}
one three four

[bob in ~] unset ARRAY

[bob in ~] echo ${ARRAY[*]}
<--no output-->

Length of Array

[root@localhost ~]# ary1=(a b c d)
[root@localhost ~]# echo ${#ary1[@]}
4
[root@localhost ~]# ary1[4]=e

[root@localhost ~]# echo ${ary1[@]}
a b c d e
[root@localhost ~]# echo ${#ary1[@]}
5


Looping through the Array

Put the content of a file in an array

a=( $( cat /tmp/ReqUrl.txt ) );
for i in ${a[@]};
do
echo ${i}
done

Loop the array item by item in a for loop



for (( k = 0 ;k < ${#a1[@]} ; k++ ))
do
echo ${a1[$k]} ${a2[$k]} `timediff ${a1[$k]} ${a2[$k]}`
done
 

Loop until we find an empty string 

count=0
while [ "x${wholist[count]}" != "x" ]
do
   count=$(( $count + 1 ))
done

 

Bash Variable Expansion

Shell Parameter and Variable Expansion

The "$" character introduces parameter expansion, command substitution, or arithmetic expansion.

e.g
[root@localhost ~]# echo $SHELL
/bin/bash
[root@localhost ~]# echo ${SHELL}
/bin/bash

The basic form of parameter expansion is "${PARAMETER}". The value of "PARAMETER" is substituted. The braces are required when "PARAMETER" is a positional parameter with more than one digit, or when "PARAMETER" is followed by a character that is not to be interpreted as part of its name.

Length of Variable

[root@localhost ~]# echo $SHELL
/bin/bash

[root@localhost ~]# echo ${#SHELL}
9
[root@localhost ~]# declare -i a=123
[root@localhost ~]# declare -p a
declare -i a="123"
[root@localhost ~]# echo ${#a}
3

Indirect Expansion

If the first character of "PARAMETER" is an exclamation point, Bash uses the value of the variable formed from the rest of "PARAMETER" as the name of the variable; this variable is then expanded and that value is used in the rest of the substitution, rather than the value of "PARAMETER" itself. This is known as indirect expansion.

[root@localhost ~]# echo ${!SH*}
SHELL SHELLOPTS SHLVL

Command Substitution

$(COMMAND) or `COMMAND`

[root@localhost ~]# date
Thu Jan  8 17:01:43 PST 2015
[root@localhost ~]# echo date
date
[root@localhost ~]# echo `date`
Thu Jan 8 17:01:51 PST 2015
[root@localhost ~]# echo This is the date: `date`
This is the date: Thu Jan 8 17:01:56 PST 2015

Arithmetic Expansion

BASH only supports interger arithmetic
[root@localhost ~]# product=$((3.6*4.9))
-bash: 3.6*4.9: syntax error: invalid arithmetic operator (error token is ".6*4.9")
Interpret as command expansion
[root@localhost ~]# product=$("36*49")
-bash: 36*49: command not found
[root@localhost ~]# product=$(36*49)
-bash: 36*49: command not found
[root@localhost ~]# product=$((36*49))
[root@localhost ~]# echo $product
1764


[root@localhost ~]# expr 4 + 5
9
[root@localhost ~]# a=$(expr 4 + 5)
[root@localhost ~]# echo $a
9

Arithmetic for decimal number

- bc
[root@localhost ~]# echo "scale=100;3.222553*8.77777" | bc
28.28682904681
[root@localhost ~]# echo "3.222553*8.77777" | bc
28.286829
[root@localhost ~]# echo "scale=2;3/8" | bc
.37
[root@localhost ~]# echo "scale=5;3/8" | bc
.37500
[root@localhost ~]# echo "scale=1;3/8" | bc
.3
[root@localhost ~]# echo "scale=2;3/8" | bc
.37
[root@localhost ~]# echo "3/8" | bc
0