bash脚本语言是一种解释性语言,执行时通过解释器执行,不需要编译。
一、变量
本地变量:使用格式为varname=值,本地变量的声明周期为整个脚本进程
局部变量:使用格式为local varname=值,局部变量的声明周期为整个脚本进程
环境变量:使用格式为export varname=值,作用域为当前shell进程及子进程。命令脚本在执行时,会启动shell的子进程,命令行中启动的脚本会继承当前的shell环境变量,系统自动执行脚本(非命令行启动)就需要自我定义环境变量
位置变量:$1,$2...表示引用的参数
shift:踢出参数 shift n:表示踢出n个参数
特殊变量:$?保存了上一个命令执行的状态返回值(程序执行可能有两类返回值,一种是执行的状态返回值,一种是执行命令的返回值),程序状态返回代码:(0-255), 0:表示执行正确,1-255:都是错误的
撤销变量:unset 变量名称 eg:unset A
查看当前shell中的变量:set
查看当前shell中的环境变量:printenv,env,export
在原来的值后面补加一个值:
ANIMALS=pig
ANIMALS=$ANIMALS:gost
执行结果:pig:gost
二、算术运算
使用let命令做运算:let C=$A+$B
$[算数运算表达式]:C=$[$A+$B]
$((运算表达式)): C=$(($A+$B))
expr算数运算表达式,表达式中各操作及运算符之间要有空格,而且要使用反引号将命令引用(输入法切换到英文,波浪号键即为反引号键):
C=`expr $A + $B`
三、条件测试
条件测试类型:
整数测试,字符测试,文件测试
3种测试命令:
test 表达式 eg: if test $A -eq $B;then echo "deng"; else echo "budeng"; fi
[ 表达式 ] eg: if [ $A -eq $B ];then echo "deng"; else echo "budeng"; fi
[[ 表达式 ]] eg: if [[ $A -eq $B ]];then echo "deng"; else echo "budeng"; fi
注意:后两种表达式前后必须有空格
数值测试:
-eq:是否相等
-ne:是否不等
-ge:是否大于等于
-le:是否小于等于
-gt:是否大于
-lt:是否小于
字符串测试:
=或==:是否等于
>:是否大于
<:是否小于
!=:是否不等于
=~:左侧字符串是否能够被右侧PATTERN所匹配 [[ ]]中使用
-z "STRING":测试字符串是否为空,空则为真
-n "STRING":测试字符串是否非空,不空则为真
注意:用于字符串比较时用到的操作数都应该使用引号括起来
文件测试:
存在性测试:
-a FILE:同下
-e FILE:文件存在性测试,存在为真,否则为假
存在性及类别测试:
-b FILE:是否存在且为块设备文件
-c FILE:是否存在且为字符设备文件
-d FILE:是否存在且为目录文件
-f FILE:是否存在且为普通文件
-h FILE 或-L FILE:是否存在且为符号链接文件
-p FILE:是否存在且为命名管道文件
-S FILE:是否存在且为套接字文件
文件权限测试:
-r FILE:是否存在且可读
-w FILE:是否存在且可写
-x FILE:是否存在且可执行
文件特殊权限测试:
-g FILE:是否存在且拥有sgid权限
-u FILE:是否存在且拥有suid权限
-k FILE:是否存在且拥有sticky权限
文件大小测试:
-s FILE:是否存在且非空
文件是否打开:
-t fd:fd表示文件描述符是否已经打开且与某终端相关
其它:
-N FILE:文件自从上一次被读取之后是否被修改过
-O FILE:当前有效用户是否为文件属主
-G FILE:当前有效用户是否为文件属组
双目测试:
FILE1 -ef FILE2:FILE1与FILE2是否指向同一个设备上的相同inode
FILE1 -nt FILE2:FILE1是否新于FILE2
FILE1 -ot FILE2:FILE1是否旧与FILE2
组合条件测试:
逻辑运算:
[ ]中使用:
EXPRESSION1 -a EXPRESSION2:2个条件同时为真,则结果为真
EXPRESSION1 -o EXPRESSION2:2个条件中其中一个条件为真,则结果为真
! EXPRESSION:条件为假时,则结果为真
[[ ]]或[ ] ** [ ]中使用: 注:**为&&或||
&&: 左右两边条件或命令同时为真,则结果为真
||:左右两边条件或命令其中一个为真时,则结果为真
!:条件或命令为假时,则结果为真
注:[ ]中使用小括号需要转义即\(\),[[ ]]则无需转义
四、条件判断控制结构
单分支的if语句:
if 判断条件; then
statement1
statement2
fi
双分支的if语句:
if 判断条件; then
statement1
statement2
else
statement3
statement4
fi
多分支的if语句
if 判断条件;then
statement1
...
elif 判断条件;then
statement2
...
elif 判断条件;then
statement3
...
else
statement4
...
fi
五、case分支选择结构
case $变量 in
值1)命令 ;;
...
值n)命令 ;;
*) 默认命令;;
esca
注意每个条件末尾都是两个分号。
bash分支选择结构当中没有break,但是两个分号就代表break的含义。c语言中每个条件(case语句)后面不一定都要有break,如果没有break,则继续执行下面的条件的语句,即多个分支共用一组语句。如果你想在bash中像c语言那样多个条件共用一套语句,可以在分支末尾使用一个分号加一个and符号,eg:
case $ans in
y);&
Y) echo "我也是";;
n);&
N) echo "sorry,跟你没什么好谈的";;
esac
除了 ;&结束语句以外,还有一种是 ;;& 来结束语句的用法。但是意义有所不同,;;&的用法是使得条件越来越精确。
eg:
case $num in
*)echo -n "中国";;&
03*)echo -n "河北省";;&
??10)echo "邯郸市";;
??11)echo "石家庄";;
??17)echo "沧州市";;
07*)echo -n "江西省";;&
??91)echo "南昌市";;
??92)echo "九江市";;
??97)echo "赣州市";;
esac
六、循环控制结构
for 变量 in 列表;do //形式1 eg:for i in {1..20} ; do
表达式 echo $i
done done
for ((expr1;expr2;expr3));do //形式2,近似于C语言
表达式
done
while CONDTION;do
表达式
done
进入循环,条件满足
退出条件,条件不满足
until CONDITION;do
表达式
done
进入循环,条件不满足
退出循环,条件满足
在while,until , for循环结构中
break:提前退出循环
continue:提前进入下一轮循环
七、函数
函数是实现结构化编程重要的思想,主要目的是实现代码重用
定义一个函数:
function FUNCNAME //形式1
{
函数体
}
FUNCNAME() //形式2,函数名紧跟小括号不能加空格
{
函数体
}
调用只需要使用函数名即可
bash -x 脚本名 查看脚本执行的过程
注意:函数的执行结果和函数的执行状态结果是不同的
引用函数的执行结果:变量=`函数名`
引用函数的状态结果:函数调用之后 echo $?
脚本的执行状态结果取决于执行的最后一个命令
自定义执行状态返回值 return #