1 BASH Programming - Introduction HOW-TO :http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-7.html
- 第十三章、学习 Shell Scripts : http://vbird.dic.ksu.edu.tw/linux_basic/0340bashshell-scripts_1.php
- check CS246's official note (Excellent !)
5. Variables
You can use variables as in any programming languages. There are no data types. A variable in bash can contain a number, a character, a string of characters.
You have no need to declare a variable, just assigning a value to its reference will create it.
5.1 Sample: Hello World! using variables
#!/bin/bash
STR="Hello World!"
echo $STR
5.2 Sample: A very simple backup script (little bit better)
#!/bin/bash
OF=/var/my-backup-$(date +%Y%m%d).tgz
tar -cZf $OF /home/me/
Some more examples:
echo ls
echo $(ls)
5.3 Local variables
Local variables can be created by using the keyword local. (default is global variable)
#!/bin/bash
HELLO=Hello
function hello {
local HELLO=World
echo $HELLO
}
echo $HELLO
hello
echo $HELLO
can use 'unset var' to remove variable
Condition
6.4 Sample: Conditionals with variables
#!/bin/bash
T1="foo"
T2="bar"
if [ "$T1" = "$T2" ]; then
echo expression evaluated as true
else
echo expression evaluated as false
fi
Use 'test expr' or '[ expr ]' to run the expr. Return 0 if the expression is true and 1 otherwise
e.g:
i=3
test 3 -lt 4
echo ${?} #true
test `whoami`=jinchao # equal to [ `whoami`=jinchao ]
echo ${?}
test 2 -lt ${i} -o `whoami`=jinchao #compound test, expr1 -o expr2: logical or;
expr1 -a expr2 : logical and;
[ -e a.cc ] # file test, exist a file called 'a.cc' under current directory
Loop
7.1 For sample
#!/bin/bash
for i in $( ls ); do
echo item: $i
done
7.2 C-like for
fiesh suggested adding this form of looping. It's a for loop more similar to C/perl... for.
#!/bin/bash
for i in `seq 1 10`;
do
echo $i
done
7.3 While sample
#!/bin/bash
COUNTER=0
while [ $COUNTER -lt 10 ]; do
echo The counter is $COUNTER
let COUNTER=COUNTER+1
done
This script 'emulates' the well known (C, Pascal, perl, etc) 'for' structure
7.4 Until sample
#!/bin/bash
COUNTER=20
until [ $COUNTER -lt 10 ]; do
echo COUNTER $COUNTER
let COUNTER-=1
done
Function
Declaring a function is just a matter of writing function my_func { my_code }.
Calling a function is just like calling another program, you just write its name.
8.1 Functions sample
#!/bin/bash
function quit {
exit
}
function hello {
echo Hello!
}
hello
quit
echo foo
8.2 Functions with parameters sample
#!/bin/bash
function quit {
exit
}
function e {
echo $1
}
e Hello
e World
quit
echo foo
User Interface
9.1 Using select to make simple menus
#!/bin/bash
OPTIONS="Hello Quit"
select opt in $OPTIONS; do
if [ "$opt" = "Quit" ]; then
echo done
exit
elif [ "$opt" = "Hello" ]; then
echo Hello World
else
clear
echo bad option
fi
done
If you run this script you'll see that it is a programmer's dream for text based menus. You'll probably notice that it's very similar to the 'for' construction, only rather than looping for each 'word' in $OPTIONS, it prompts the user.
9.2 Using the command line
#!/bin/bash
if [ -z "$1" ]; then
echo usage: $0 directory
exit
fi
SRCD=$1
TGTD="/var/backups/"
OF=home-$(date +%Y%m%d).tgz
tar -cZf $TGTD$OF $SRCD
What this script does should be clear to you. The expression in the first conditional tests if the program has received an argument ($1) and quits if it didn't, showing the user a little usage message. The rest of the script should be clear at this point.
Misc
10.1 Reading user input with read
#!/bin/bash
echo Please, enter your name
read NAME
echo "Hi $NAME!"
- As a variant, you can get multiple values with read, this example may clarify this.
#!/bin/bash
echo Please, enter your firstname and lastname
read FN LN
echo "Hi! $LN, $FN !"
10.2 Arithmetic evaluation
echo 1 + 1 # wrong
echo $((1+1)) # correct
echo $[1+1] # correct
- If you need to use fractions, or more math or you just want it, you can use bc to evaluate arithmetic expressions.
- if i ran "echo $[3/4]" at the command prompt, it would return 0 because bash only uses integers when answering. If you ran "echo 3/4|bc -l", it would properly return 0.75.
10.4 Getting the return value of a program
In bash, the return value of a program is stored in a special variable called $?.
This illustrates how to capture the return value of a program, I assume that the directory dada does not exist. (This was also suggested by mike)
#!/bin/bash
cd /dada &> /dev/null
echo rv: $?
cd $(pwd) &> /dev/null
echo rv: $?
---- output ----
rv: 1 # dada not exit, return 1 (error)
rv: 0 # pwd excute successfully, return 0 (normal)
exit [N] : N=0 menas success; else means error
10.5 Capturing a commands output (important)
This little scripts show all tables from all databases (assuming you got MySQL installed). Also, consider changing the 'mysql' command to use a valid username and password.
#!/bin/bash
DBS=`mysql -uroot -e"show databases"` # run a command and capture the return in DBS
for b in $DBS ;
do
mysql -uroot -e"show tables from $b"
done