现在的位置: 首页 > 综合 > 正文

[转载]BASH脚本编程速成

2018年04月30日 ⁄ 综合 ⁄ 共 2716字 ⁄ 字号 评论关闭
基础
——
    所有的脚本都必须告诉Linux用什么来作这个脚本的解释器。所以BASH脚本的第一行应该是:

#!/bin/bash

如果要把这个脚本变为可执行的话,需要在命令行打入:

~ chmod +x filename

变量(Variables)
————————
1. 建立一个变量并赋值:

varname=value

    一个变量是没有数据类型的,可以是字符串、数字等等,所以不需要一开始来定义。

2. 要使用一个变量,我们就要在变量名前面加上$:

echo $varname

3. 如果想在脚本中使用命令行上的参数,我们使用$#,这里的“#”表示命令行上的参数的序号。比如有个命令:

~ command var1 var2 ... varX

那么在脚本中调用上面命令行中的参数就应该是:

echo var1 is $1, var2 is $2 ...

BASH中的内置变量(Built-In Variables)
———————————————————
$1 - $n
    保存了命令行上依次从1到n的参数

$?
    保存了上个命令结束后的结束值

$0
    保存了命令行上的第一个单词(这个脚本程序的名字)

$*
    保存了命令行上从1到n所有的参数($1 $2 ... $n)

"$@"
    保存了命令行上从1到n所有的参数,而且放在了双引号中间("$1" "$2" ... "$n")

引用标志(Quote Marks)
———————————
双引号("like this")
    可以让解释程序忽略里面的空格,把里面所有的字符都当作一个值,但是不会忽略某些特殊的字符。

单引号('like this')
    可以让解释程序忽略里面所有的特殊字符,包括空格,把里面所有的字符都当作一个值。

反单引号(`command`)
    和前面两个引号不一样,这个可以用来表示另外一个命令运行后的结果,比如:

contents = `ls`

然后contents就可以表示列出后文件目录列表。

逻辑和比较
—————
    一个叫做test的命令可以用来判断一个条件是否为true,就好像if-then语句是用来判断一个循环是否结束一样:

test expression
或者
[expression]

数学比较式
—————
int1 -eq int2
    返回True,如果int1等于int2

int1 -ge int2
    返回True,如果int1大于或等于int2

int1 -gt int2
    返回True,如果int1大于int2

int1 -le int2
    返回True,如果int1小于或等于int2

int1 -lt int2
    返回True,如果int1小于int2

int1 -ne int2
    返回True,如果int1不等于int2

字符比较式
—————
str1 = str2
    返回True,如果str1和str2相等

str1 != str2
    返回True,如果str1和str2不相等

str
    返回True,如果str不为空

-n str
    返回True,如果str的长度大于零

-z str
    返回True,如果str的长度等于零(注意:字符串长度为零和字符串为空不一样)

文件比较式
—————
-d filename
    返回True,如果filename是个目录

-f filename
    返回True,如果filename是个标准的文件

-r filename
    返回True,如果filename可以被进程读取

-s filename
    返回True,如果filename是一个长度不为零的文件

-w filename
    返回True,如果filename可以被进程写入

-x filename
    返回True,如果filename是可执行的

表达式比较式
——————
!expression
    返回True,如果expression不为true

expr1 -a expr2
    返回True,如果expr1和expr2都为true(&&, and)

expr1 -o expr2
    返回True,如果expr1或expr2为true(||, or)

逻辑语句
————
小提示:
    每个语句的结束字都是这个语句的开始字的反向拼写,例如if的结束字就是fi,case的结束字就是esac。

1. If...then 

if [ expression ]
   then
       commands
fi

2. If..then...else 

if [ expression ]
   then
       commands
   else
       commands
fi

3. If..then...else If...else 

if [ expression ]
   then
       commands
elif [ expression2 ]
   then
       commands
   else
       commands
fi

4. Case select 

case string1 in
    str1)
        commands;;
    str2)
        commands;;
    *)
        commands;;
esac

     string1是和str1、str2做比较的。如果其中一个符合string1,那么;;之前相应的命令就会被执行。如果两个都不符合的话,星号后面相对应的命令就会被执行。这是缺省条件执行命令,因为星号符合所有的字符串。

循环语句
————
for var1 in list
do
    commands
done

    在这个循环中,list中的每个项目都会被执行一次。这个list中的项目可以是一些由空格分开的命令(比如ls或者cat),或者是一些特定的值。每次循环的时候,变量var1就会被赋予当前的项,一直执行到最后一个。

while [ expression ]
do
    commands
done

until [ expression ]
do
    commands
done

    这两个和其他语言中的循环语句差不多,这里就不多做介绍了。

函数
——
1. 建立一个函数:

fname(){
    commands
}

    要调用这个函数的话,直接用fname就可以了。

2. 建立一个带参数的函数

fname2 (arg1,arg2...argN){
    commands
}

    可以用 fname2 arg1 arg2 ... argN 来调用它。

抱歉!评论已关闭.