bash shell syntax

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 中执行的情况如下:

C:\Users\caoi\Desktop\bash_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

循环

和其他语言一样,Bash shell 同样有 while, for 这两种循环。

for 循环

for 循环示例如下:

#!/bin/bash

for i in Bob Iridium Jenny

do

    echo Hello, $i!

done

输出如下:

Hello, Bob!

Hello, Iridium!

Hello, Jenny!

while 死循环

示例如下:

#!/bin/bash

while true

do

    echo hello, $RANDOM

done

这是一个死循环,不断输出 hello, 随机数,如它的一部分输出:

hello, 20391

hello, 1404

hello, 13958

hello, 21021

hello, 8402

hello, 29312

普通的 while 循环

举例如下:

#!/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.

函数 Function

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