一、脚本语言跟编译型语言的区别
1、脚本语言
不需编译,由解释器解释执行;
弱类型:变量类型;
变量通常不需要实现声明;
2、编译型语言
事先编译(源程序-->目标代码-->链接-->执行);运行时不再依赖于编译器;
强类型;
变量需要事先声明;
二、变量类型
1、本地变量
set VAR_NAME=value #定义变量 unset VAR_NAME #取消变量 ${VAR_NAME} #引用变量
作用范围:当前shell进程
2、局部变量
local VAR_NAME=value #定义变量 unset VAR_NAME #取消变量 ${VAR_NAME} #引用变量
作用范围:当前shell进程局部有效
3、环境变量
export VAR_NAME=value unset VAR_NAME ${VAR_NAME}
作用范围:当前shell进程及其子shell进程
4、位置变量:$1,$2,$3...
5、特殊变量:$$,$?,$#,$@...
三、Bash Shell脚本
# bash /path/to/script_file.sh
1、 独立执行:
要有执行权限;
定义好shebang, 即脚本的第一行:#!/path/to/explainer
例如:#!/bin/bash “#”只有脚本第一行的“#”有特殊意义外,其他行的都为注释行运行脚本时不执行。
2、bash的配置文件
profile类:/etc/profile, /etc/profile.d/*.sh, ~/.bash_profile
声明环境变量
执行程序或脚本
bashrc类:/etc/bashrc, ~/.bashrc
定义本地变量
定义命令别名
3、变量命名规则
只能包含字母数字和下划线
不能以数字开头
严格区分大小写
要做到见名知意
命名规范,风格统一
不能跟系统变量重名
4、控制语句
for
while
until
四、for循环
事先提供一个元素列表,而后,使用变量去遍历此元元素列表;每访问一个元素,就执行一次循环体;直到元素访问完毕。
1、用法格式:
for VAR_NAME in 元素1 元素2 ...; do 语句1; 语句2; ... done
2、 脚本写完在执行前测试有没有语法错误,就以test.sh为例
bash -n test.sh #测试脚本有没语法错误 chmod +x test.sh #给脚本执行权限 ./test.sh #执行测试 bash -x test.sh #执行时显示执行过程
3、添加user1,user2,user3三个用户,并配置与用户名相同的秘密
#!/bin/bash # for UserName in user1 user2 user3; do useradd $UserName echo $UserName | passwd --stdin $UserName done
4、 写一个脚本,显示/etc/inittab, /etc/rc.d/rc.sysinit, /etc/fstab三个文件各有多少行
for FileName in /etc/inittab /etc/rc.d/rc.sysinit /etc/fstab; do wc -l $FileName done
5、使用for循环统计/etc/fstab、/etc/rc.d/rc.sysinit、/etc/inittab文件中各自以#开头的行的行数和空白行数
#!/bin/bash for File in /etc/fstab /etc/rc.d/rc.sysinit /etc/inittab; do echo "$File:" echo -e "\t#lines: `grep "^#" $File | wc -l`" echo -e "\tspace lines: `grep "^$" $File | wc -l`" done
6、使用for循环,复制/etc/fstab、/etc/inittab和/etc/rc.d/init.d/functions文件至/tmp/目录中,并重命名为原有的名称之后加当前日期,如第一个文件为/tmp/fstab-2013-07-15
#!/bin/bash for File in /etc/fstab /etc/inittab /etc/rc.d/init.d/functions; do cp $File /tmp/$File-`date +%F` done
7、生成数字序列
{}:{起始数字..结束数据},例如{1..100}表示从1到100之间的所有正整数;
`seq [起始数字] [步长] 结束数字`
8、使用for循环取出每个用户用户名和Shell
#!/bin/bash LINES=`wc -l /etc/passwd | cut -d' ' -f1` #看清楚这里用的是反引号! for I in `seq 1 $LINES`; do head -$I /etc/passwd | tail -1 | cut -d: -f1,7 done
9、写一个脚本,计算100以内所有整数的和
#!/bin/bash # Sum=0 for I in {1..100}; do #这里使用的就是数字序列 Sum=$[$Sum+$I] done echo "The sum is: $Sum."
10、写一个脚本,计算100以内,所有偶数的和,以及所有奇数的和
#!/bin/bash EvenSum=0 OddSum=0 for I in `seq 1 2 100`; do OddSum=$[$OddSum+$I] done for I in `seq 2 2 100`; do EvenSum=$[$EvenSum+$I] done echo "Even Sum: $EvenSum; Odd Sum: $OddSum."