一、基础概念点
1.语言特点
脚本语言:
不需编译,由解释器解释执行;
弱类型:变量类型
变量通常不需要事先声明编译语言 (gcc: GNU C Complier)
事先编译(源程序-->目标代码-->链接-->执行);运行时不再依赖于编译器;
强类型
变量需要事先声明脚本语言:bash, python, perl, ruby
bash:面向过程
2.变量类型:
本地变量
set VAR_NAME=value
unset VAR_NAME
${VAR_NAME}
作用范围:当前shell进程;
局部变量
local VAR_NAME=value
unset VAR_NAME
${VAR_NAME}
作用范围:在当前shell进程的局部范围内有效;
环境变量
export VAR_NAME=value
unset VAR_NAME
${VAR_NAME}
使用范围:当前shell及其子shell;
位置变量:$1, $2, ...
特殊变量:$$, $?, $#, $@, ...
$0 取脚本本身文件名 一般用basename $0 取基名
3.bash脚本路径:
# bash /path/to/script_file.sh
独立执行:
1、要有执行权限;
2、定义好shebang, 即脚本的第一行:#!/path/to/explainer,例如:/bin/bash, /usr/bin/python
/root/a.sh
# /root/a.sh: 所有命令都会到PATH环境变量所定义的路径下去查找;
# export PATH=$PATH:/root
4.bash的配置文件
profile类:/etc/profile, /etc/profile.d/*.sh, ~/.bash_profile
声明环境变量
执行程序或脚本
bashrc类:/etc/bashrc, ~/.bashrc
定义本地变量
定义命令别名
5.bash脚本流程控制
顺序执行:默认法则,逐条执行各语句
选择执行:条件判断,只有部分是符合条件,只执行符合条件的部分;
布尔测试:真,假;
0:真
1-255:假
循环执行:将同一段代码反复执行n次;循环必须要有退出条件,否则,就成为了死循环;控制语句:
bash循环控制语句:
for
while
until
6.shell脚本中进行算术运算:
shell不支持浮点数;计算结果中的浮点数会被圆整为整数;1.23, 1; 1.99=1;
+, -, *, /,
算术运算的实现方式:假设A=5,B=9
$[expression]:例如$[$A+$B]
$((expression)): 例如$(($A+$B))
let expression: 例如 let E=$A+$B
expr expression: F=`expr $A + $B` #加号两侧必须有空格不同于以上方式
二、bash的for循环:
1.基本形式
事先提供一个元素列表,而后,使用变量去遍历此元元素列表;每访问一个元素,就执行一次循环体;直到元素访问完毕;
用法格式:
for VAR_NAME in 列表;do
语句1;
语句2;
...
done2. 列表的生成:
1、逐个给出,如:/etc/inittab /etc/fstab;
2、使用通配符实现文件通配,例如for File in /var/*;
3、使用命令生成列表:见下面的例子
#!/bin/bash
for File in `ls /var`; do
file /var/$File
done4、生成数字序列:
{}:{起始数字..结束数据},例如{1..100}表示从1到100之间的所有正整数;
`seq [起始数字] [步长] 结束数字`: 步长默认1 可省略3. 例,使用for循环统计/etc/fstab、/etc/rc.d/rc.sysinit、/etc/inittab文件中各自以#开头的行的行数和空白行数;
#!/bin/bashfor File in /etc/fstab /etc/rc.d/rc.sysinit /etc/inittab; do
echo "$File:"
echo -e "\t#lines: `grep "^#" $File | wc -l`" #-e选项允许转义输出,此种输出方式使脚本更易读。
echo -e "\tspace lines: `grep "^$" $File | wc -l`"
done4. 例,写一个脚本使用for循环取出每个用户用户名和Shell;
#!/bin/bash
LINES=`wc -l /etc/passwd | cut -d' ' -f1` #此处-d后不可用[:space:]for I in `seq 1 $LINES`; do
head -$I /etc/passwd | tail -1 | cut -d: -f1,7
done
三、bash脚本条件判断
1.四种条件测试方式:
bash命令;
[ expression ];
[[ expression ]];
test expression ;
整数测试
大于:-gt
小于:-lt
等于:-eq
大等:-ge
小等:-le
不等:-ne
命令执行状态返回值: 0-255
0: 正确执行
1-255: 错误执行
exit [n]
脚本执行的最后一条件命令的状态返回值;bash字符测试:
>: 大于
<: 小于
==: 等于
=~: 判断左边的字符串是否能够被右边的模式所匹配;通常用于[[]];
[[ $opt1 =~ $opt2 ]] =~ 两侧要有空格
只做行首、行尾锚定不可词尾锚定;字符串可以加引号(引用变量),模式不要加引号;单目:
-z $STRING: 为空则为真,不空则为假; 如if [ -z $Shell ]; then-n $STRING: 为空则为假,不空则真;
文件测试:操作符 文件路径
-f: 测试其是否为普通文件,即ls -l时文件类型为-的文件;
-d: 测试其是否为目录文件,即ls -l时文件类型为d的文件;
-e: 测试文件是否存在;存在为真,否则为假;
-r: 测试文件对当前用户来说是否可读;
-w: 测试文件对当前用户来说是否可写;
-x: 测试文件对当前用户来说是否可执行;
-s: 测试文件大小是否不空,不空则真,空则假;
2.组合条件测试
短路操作:只要前半段已经可以决定最终结果,后半段就不再运算;
与运算:
真 && 真 = 真
真 && 假 = 假
假 && {真|假} = 假或运算:
假 || 0 = 0
假 || 1 = 1真 || =1
[ -e /tmp/test10 ] || mkdir /tmp/test10
4.bash条件判断之多分支if语句:
语法格式:
if 条件1; then
语句1
语句2
...
elif 条件2; then
语句1
语句2
...
elif 条件3; then
语句1
语句2
...
else
语句1
语句2
...
fi5.shift [n]:实现位置参数轮替; n为一次清除几个位置变量 默认为1
例子:通过参数传递n个正整数给脚本,求其和;
#!/bin/bash
#
Sum=0
for I in `seq 1 $#`; do
Sum=$[$Sum+$1]
shift
doneecho $Sum
四、实用例子
1.使用包含3个参数的脚本便捷创建脚本文件
#!/bin/bash
if [ $# -ne 3 ]; then
echo "the number of arguements is wrong."
exit 4
fiecho '#!/bin/bash' >> $3
if [ $1 == '-a' ]; then
echo "# Author: $2" >> $3
elif [ $1 == '-d' ]; then
echo "# Date: $2" >> $3
elif [ $1 == '-D' ]; then
echo "# Description: $2" >> $3
else
echo "Unknown option, ignore it."
rm -f $3
exit 5
fivim + $3 #用vim打开脚本文件
if bash -n $3 &> /dev/null; then
chmod +x $3
else
echo "Syntax wrong in $3."
fi
六、bash脚本调试命令
脚本文件中,所有以#开头的行均为注释行,不会被执行;
检查脚本的语法错误,不执行脚本:
bash -n /path/to/script_file.sh调试执行脚本:
bash -x /path/to/script_file.sh