——
所有的脚本都必须告诉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 来调用它。