Linux/unix上常见的shell脚本解释器有bash,sh,csh,ksh,习惯上称他们为一种shell。
Bash是linux标准默认的shell。
Sh是unix标准默认的shell。
Ash三系统资源占用最少的shell。
csh比较大,功能也比较强大。
Ksh和商业发行版完美兼容。
脚本文件的扩展名并不影响脚本的执行,见名知意即可。
#!是一个约定标记,它告诉系统应该用什么解释器执行,使用那一种shell。#!/bin/bash
执行脚本的时候,使用./test.sh来执行。如果没有./,linux系统会去PATH变量中找,加了./就是在当前路径。
定义变量的时候注意变量和等号之间不能有空格。首个字符必须为字母,中间不能有空格,可以有下划线。定义的时候前面不用加美元符号。使用的时候,加上美元符号即可。变量名外面可以加上大括号,大括号主要是为了帮助解释器识别变量的边界。
重新定义只要当作没有定义过就行了。
定义只读变量,只要在定义好变量后,另起一行,readonlyvar就可以了。
删除变量,unsetvar
$0 | 当前脚本的文件名 |
$n | 传递给脚本或函数的参数。n是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。 |
$# | 传递给脚本或函数的参数个数。 |
$* | 传递给脚本或函数的所有参数。 |
$@ | 传递给脚本或函数的所有参数。被双引号("")包含时,与 $*稍有不同,下面将会讲到。 |
$? | 上个命令的退出状态,或函数的返回值。 |
$$ | 当前Shell进程ID。对于Shell脚本,就是这些脚本所在的进程ID。 |
echo-e “Value of a is $a \n”这句话中,在引号中使用变量,shell会对其进行替换,就是在表达式中如果有特殊字符,shell会对其进行替换。还有一个就是转义字符,\n这里是换行的意思,前面的-e就是说,对转义字符也进行替换,如果不使用-e,就会输出\n。
转义字符 | 含义 |
---|---|
\\ | 反斜杠 |
\a | 警报,响铃 |
\b | 退格(删除键) |
\f | 换页(FF),将当前位置移到下页开头 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符(tab键) |
\v | 垂直制表符 |
``反引号,在esc键的下方。
命令替换,`command`先执行命令,把结果存起来,在适当的地方输出。
DATE=`date`这样,即使在后面输出DATE,也是在执行这条语句的时间。
变量替换
形式 | 说明 |
---|---|
${var} | 变量本来的值 |
${var:-word} | 如果变量 var为空或已被删除(unset),那么返回 word,但不改变 var的值。 |
${var:=word} | 如果变量 var为空或已被删除(unset),那么返回word,并将var的值设置为 word。 |
${var:?message} | 如果变量 var为空或已被删除(unset),那么将消息message送到标准错误输出,可以用来检测变量var是否可以被正常赋值。 |
${var:+word} | 如果变量 var被定义,那么返回 word,但不改变var的值。 |
bash不支持简单的数学计算,但是可以通过其他的命令来实现。expr,awk等,其中expr是最常用
val=`expr2 + 2`
注意,赋值不能有空格,但是计算表达式必须有空格,2+ 2 就不能写成2+2.
-
-* / % == !=,其中要注意的是,*必须加反斜杠\,也就是说2 \* 2才可以。
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
-eq-ne -gt -lt -ge -le
布尔运算 -o或运算-a与运算!非运算
字符串运算。
= | 检测两个字符串是否相等,相等返回 true。 | [$a = $b ] 返回 false。 |
!= | 检测两个字符串是否相等,不相等返回 true。 | [$a != $b ] 返回 true。 |
-z | 检测字符串长度是否为0,为0返回true。 | [-z $a ] 返回 false。 |
-n | 检测字符串长度是否为0,不为0返回true。 | [-z $a ] 返回 true。 |
str | 检测字符串是否为空,不为空返回 true。 | [$a ] 返回 true。 |
文件测试运算符
操作符 | 说明 | 举例 |
---|---|---|
-bfile | 检测文件是否是块设备文件,如果是,则返回true。 | [-b $file ] 返回 false。 |
-cfile | 检测文件是否是字符设备文件,如果是,则返回true。 | [-b $file ] 返回 false。 |
-dfile | 检测文件是否是目录,如果是,则返回 true。 | [-d $file ] 返回 false。 |
-ffile | 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回true。 | [-f $file ] 返回 true。 |
-gfile | 检测文件是否设置了 SGID位,如果是,则返回 true。 | [-g $file ] 返回 false。 |
-kfile | 检测文件是否设置了粘着位(StickyBit),如果是,则返回 true。 | [-k $file ] 返回 false。 |
-pfile | 检测文件是否是具名管道,如果是,则返回 true。 | [-p $file ] 返回 false。 |
-ufile | 检测文件是否设置了 SUID位,如果是,则返回 true。 | [-u $file ] 返回 false。 |
-rfile | 检测文件是否可读,如果是,则返回 true。 | [-r $file ] 返回 true。 |
-wfile | 检测文件是否可写,如果是,则返回 true。 | [-w $file ] 返回 true。 |
-xfile | 检测文件是否可执行,如果是,则返回 true。 | [-x $file ] 返回 true。 |
-sfile | 检测文件是否为空(文件大小是否大于0),不为空返回true。 | [-s $file ] 返回 true。 |
-efile | 检测文件(包括目录)是否存在,如果是,则返回true。 | [-e $file ] 返回 true。 |
Sh中没有多行注释。
shell中定义字符串可以用单引号也可以双引号,甚至可以不用引号。
单引号中的任何字符都会原样输出,变量无效。但是转义符可以。比如\n
单引号中不能出现单引号,转义也不可以。
定义数组arry=(v1v2)
或者array[0]=v1
使用一般是var=${array[0]}
${array[*]}${array[@]}这两个可以获得数组中所有的元素。
获得数组中元素的个数length=${#array[@]}或者length=${#array[*]}
获得单个元素的长度length=${#array[n]}
echo命令,在屏幕上打印指定的字符串。Echo“OK!\c” echo “it is a test”这样不会换行。
Echo“it is a test ” >myfile可以把结果重定向到文件中。这样会覆盖原来的文件里的内容,如果不想覆盖,可以通过>>来重定向。
echo命令中,双引号可有可无,单引号主要是为了原样输出。
选择语句。
If[ expression ]
then
fi
其中注意expression和【】之间有空格。
还有
If[ expression ]
then
else
fi
和
If[ expression ]
then
elif
then
else
fi