一.Bash name
BASH = GNU Bourne-Again Shell (权威)
BASH = Born-Again Shell
BASH is a Shell in Linux, is linux default shell, execute in /bin/bash
BASH 是 Linux 操作系统上的一个 Shell,是由 /bin/bash 解释执行的。BASH支持 IEEE POSIX P1003.2/ISO 9945.2 脚本语言工具标准。
others:
Bourne shell (sh)
C shell (csh)
Korn shell (ksh)
二.Bash basis grammar
2.1 Hello world e.g.:
order: gedit hello
#!/bin/bash
#This is a very simple example
echo Hello World
order:
1)bash hello
2)sh hello
3)chmod u+x hello, ./hello
display: Hello World
BASH 程序被执行后,实际上 Linux 系统是另外开设了一个进程来运行的
2.2 stdin. stdout. stderr
在 Linux 系统中:
标准输入(stdin)默认为键盘输入;
标准输出(stdout)默认为屏幕输出;
标准错误输出(stderr)默认也是输出到屏幕(上面的 std 表示standard)
输入、输出及标准错误输出主要用于 I/O 的重定向,就是说需要改变他们的默认设置
I/O redirection e.g.:
ls > ls_result
ls -l >> ls_result
ls order result output redirection to file ls_result
2.3 Bash simple variable
a.
#!/bin/bash
# give the initialize value to STR
STR="Hello World"
echo $STR
display: Hello World
note:
1)变量赋值时,'='左右两边都不能有空格;
2)BASH 中的语句结尾不需要分号(";");
3)除了在变量赋值和在 FOR 循环语句头中,BASH 中的变量使用必须在变量前加"$"符号
4)BASH 程序是在一个新的进程中运行,所以该程序中的变量定义和赋值不改变其他进程或原始Shell 中同名变量的值,也不会影响他们的运行
5)$STR 自不过是对 ${STR} 的一种简化, 一般最好加{}
b.
#!/bin/bash
x=1999
let "x = $x + 1"
echo $x
x="olympic'"$x
echo $x
display:
2000
olympic'2000
整数运算一般通过 let 和 expr 这两个指令来实现
(变量x+1可写作: let "x = $x + 1" 或者 x=`expr $x + 1`)
2.4 compare operation:
在比较操作上,整数变量(integer)和字符串变量(string)各不相同
integer string
same -eq =
different -ne !=
greater -gt >
Less -lt <
greater or equal -ge
less or equal -le
NULL -z
not NULL -n (! -z)
e.g.
compare string whether a equel b : if [ $a = $b ]
judge the string a whether is NULL: if [ -z $a]
judge whether integer a greater than b : if [ $a -gt $b ]
2.5 BASH variable as file variable
judge whether the user can enter the /root direction:
if [ -x /root ]
2.6 About the local variable
e.g.
#!/bin/bash
HELLO=Hello
function hello {
local HELLO=World
echo $HELLO
}
echo $HELLO
hello
echo $HELLO
display:
Hello
World
Hello
执行结果表明全局变量 $HELLO 的值在执行函数 hello 时并没有被改变。局部变量 $HELLO 的影响只存在于函数那个程序块中
三. BASH 中的变量与 C 语言中变量的区别
note:
1) BASH 中的变量在引用时都需要在变量前加上 "$" 符号( 第一次赋值及在For 循环的头部不用加 "$"符号 )。
2) BASH 中没有浮点运算,因此也就没有浮点类型的变量可用。
3) BASH 中的整形变量的比较符号与C语言中完全不同,而且整形变量的算术运算也需要经过 let 或 expr 语句来处理。
3.1 if...then...else
a.
if [ expression ]
then
statements
fi
b.
if [ expression ]
then
statements
else
statements
fi
c.
if [ expression ]
then
statments
else if [ expression ]
then
statments
else
statments
fi
d.
if [ expression ]
then
statments
elif [ expression ]
then
statments
else
statments
fi
e.g.
#!/bin/bash
if [ $1 -gt 90 ]
then
echo "Good, $1"
elif [ $1 -gt 70 ]
then
echo "OK, $1"
else
echo "Bad, $1"
fi
exit 0
order: ./demo 91
display: Good, 91
如果将 if 和 then 简洁的写在一行里面,就必须在 then 前面加上分号,如:if [ expression ]; then ... 。
3.2 for
for $var in [list]
do
statments
done
其中 $var 是循环控制变量,[list] 是 $var 需要遍历的一个集合,do/done 包含了循环体
如果 do 和 for 被写在同一行,必须在 do 前面加上 ";"。如: for $var in [list]; do
a.
e.g.
#!/bin/bash
for day in Sun Mon Tue Wed Thu Fri Sat
do
echo $day
done
display:
Sun
Mon
Tue
Wed
Thu
Fri
Sat
b.
# 如果列表被包含在一对双引号中,则被认为是一个元素
if add " ", like this:
#!/bin/bash
for day in "Sun Mon Tue Wed Thu Fri Sat"
do
echo $day
done
display:Sun Mon Tue Wed Thu Fri Sat
注意上面的例子中,在 for 所在那行的变量 day 是没有加 "$" 符号的,而在循环体内,echo 所在行变量 $day 是必须加上 "$" 符号的。
c.
如果写成 for day 而没有后面的 in [list] 部分,则 day 将取遍命令行的所有参数
if no in [list] part, like this:
e.g
#!/bin/bash
for param
do
echo $param
done
exit 0
order:./demo hello ray 123
display:
hello
ray
123
3.3 while
while [ condition ]
do
statments
done
e.g.
a.
#!/bin/bash
while [ $1 = "cat" ]
do
echo "OK, $1 equal cat"
done
order:bash while cat
display:
cat equal cat
cat equal cat
cat equal cat
..................
b.
#!/bin/bash
sum=0
i=1
while(( i <= 10 ))
do
let "sum+=i"
let "i += 2"
done
echo "sum=$sum"
order:bash whi;e1
display: sum=25
3.4 until
until [ condition is TRUE ]
do
statments
done
e.g.
a.
#!/bin/bash
i=0
until [[ "$i" -gt 5 ]] #大于5
do
let "square=i*i"
echo "$i * $i = $square"
let "i++"
done
order:bash until.sh
display:
0 * 0 = 0
1 * 1 = 1
2 * 2 = 4
3 * 3 = 9
4 * 4 = 16
5 * 5 = 25
3.5 case
case "$var" in
condition1 )
statments1;;
condition2 )
statments2;;
...
* )
default statments;;
esac
e.g.
#!/bin/bash
export LC_ALL=C
echo "Hit a key, then hit return."
read Keypress
case "$Keypress" in
[A-Z] ) echo "Lowercase letter";;
[a-z] ) echo "Uppercase letter";;
[0-9] ) echo "Digit";;
* ) echo "Punctuation, whitespace, or other";;
esac
exit 0
3.6 break/continue
3.7 function
a.
function my_funcname {
code block
}
b.
my_funcname() {
code block
}
阅读(471) | 评论(0) | 转发(0) |