按:这篇文章是很早之前发布在个人 Google Site 上的,已经不知具体时间了。在转移到本地时,有少许更新。
Bash shell 作为一种解释性脚本语言,有一套完整的,和其他编程语言类似的语法。这里从简单的角度,记录一番,不求全。
前面一篇描述了如何写 Bash shell HelloWorld.
bash 的变量没有类型,定义很简单,直接变量名=变量值就算定义了,如:
#!/bin/bash
HELLO="Hello, world!"
echo $HELLO
执行后,会输出 Hello, world!
其中,第2行:
HELLO="Hello, world!"
第3行:
echo $HELLO
使用变量的方式是:$后跟变量名,变量名也可以用大括号包起来,比如这句也可以写作:
echo ${HELLO}
前面提到的都是全局变量,另外还有局部变量,参本页的「函数-局部变量」部分。
通过接受用户输入,可以书写具有交互性的脚本。如:
#!/bin/bash
echo "What's your name?"
read name
echo Hello, $name!
在 shell 中执行的情况如下:
所有的程序语言都必须处理一些相同的流程问题:顺序,分叉,循环。这里用一个例子说明分支结构:
随机生成一个随机数(0到2之间随机抽取一个整数),用户输入一个数字,脚本判断两书的大小比较情况。
#!/bin/bash
NUM=$(( RANDOM % 3 ))
echo "Please guess a number between 0 and 2"
read num
if [ $num = $NUM ]; then
echo "Congr! U R RIGHT!"
elif [ $num > $NUM ]; then
echo "greater"
else
echo "litter"
fi
elif
是 else if
的简写形式
Bash 里条件判断写在中括号中,这点和 C/Java 语言有些不一样。
其中,第5行:
if [ $num = $NUM ]; then
then
是必要的关键字和其他语言一样,Bash shell 同样有 while, for 这两种循环。
for 循环示例如下:
#!/bin/bash
for i in Bob Iridium Jenny
do
echo Hello, $i!
done
输出如下:
Hello, Bob!
Hello, Iridium!
Hello, Jenny!
示例如下:
#!/bin/bash
while true
do
echo hello, $RANDOM
done
这是一个死循环,不断输出 hello, 随机数,如它的一部分输出:
hello, 20391
hello, 1404
hello, 13958
hello, 21021
hello, 8402
hello, 29312
举例如下:
#!/bin/bash
i=1
while [ $i -lt 10 ]
do
echo $i
let i=i+1
done
会依次按行输出 1, 2, ..., 9
本段 Shell 的第6行:
let i=i+1
是赋值语句,注意等号和加号左右都不能有空格。Shell 变量的赋值,要使用 let
关键字。
这段代码用等价的 for
循环,是如下代码:
#!/bin/bash
for ((i=1; i<10; i++))
do
echo $i
done
其中要注意的循环条件用双层括号包围。i<10
的小于号两侧不能有空格,小于号不能用 -lt
.
bash 支持函数,函数定义格式很简单:
function func_name { func_code }
例如:
#!/bin/bash
function hello() {
echo "Hello, world!"
}
hello
执行后会输出 Hello, world!
调用函数的语句是最后一句,仅仅写一下函数名即可,不能带括号写成 hello()
。
再举一个带参的函数:
#!/bin/bash
function hello() {
echo $1
echo $2
}
hello "a" "b"
执行后,输出:
a
b
$1
表示第一个参数,$2
表示第二个参数,以此类推。
Bash 函数是可以有返回值的,但不能用 return 语句,而是用 echo 语句。例如:
#!/bin/bash
function getDirName() {
if [ $1 = "dir11" ]; then
echo "0101"
elif [ $1 = "dir14" ]; then
echo "0102"
else
echo "others"
fi
}
for dir in dir11 dir14 dir3
do
echo $(getDirName $dir)
done
输出:
0101
0102
others
Bash 的局部变量以 local 关键字标识,例如:
#!/bin/bash
i=3 # this is global
function hello() {
local i=9 # this is local
echo "in funcition $i"
}
echo "out function $i"
echo "revoke function: $(hello)"
输出:
out function 3
revoke function: in funcition 9