编译器、解释器:将高级语言转换成机器语言

编译语言:机器语言、汇编语言和高级语言

静态语言:编译型语言

    强类型:变量在使用前,必须事先生命,甚至还需要初始化

    事先编译,事先转换成可执行格式

    C、C++、JAVA、C#

动态语言:解释型语言,on the fly

    弱类型:变量用时声明,甚至不区分类型

    边解释边执行

    PHP、shell、python、perl

面向过程:shell、C

面向对象:JAVA、python、perl、C++

脚本:命令的堆砌,按实际需求,结合命令流程控制机制源程序

shebang:魔数

#!/bin/bash:指定使用哪个shell来执行脚本

#:注释行,不执行

脚本在执行时会启动一个子shell进程;

    命令行中启动的脚本会继承当前shell环境变量;

    系统自动执行的脚本(非命令行启动)就要自我定义需要用到的各环境变量

面向过程

    控制结构

        顺序结构

        选择结构

        循环结构

选择结构:

1.if条件语句

if [ expression ] ;then

  statement1

  …

elif 条件 ;then

 statement1

  …

fi

expression中的整数比较

    -eq:测试两个整数是否相等,比如 $A -eq $B

    -ne:not equal

    -gt:greater than

    -lt:less than

    -ge:great than or equal

    -le:less than or equal

expression中的文件测试

-e FILE:测试文件是否存在

-f FILE:测试文件是否为普通文件

-b FILE:测试文件是否为块设备文件

-c FILE:测试文件是否为字符设备文件

-d FILE:测试指定路径是否为目录

-r FILE:测试当前用户对指定文件是否有读取权限

-w FILE:                   写

-x FILE:                   执行

expression中的字符或字符串测试

==:测试是否相等,相等为真,不等为假

!=:测试是否不等,不等为真,等为假

-n string:测试指定字符串是否为空,非空为真,空为假

-z string:测试指定字符串是否不空,空为真,非空为假

expression中的逻辑组合测试

    -a:与关系,两边为真才算真 <–> [ exp1 ] && [ exp2 ]

    -o:或关系,两边为假才算假 <–> [ exp1 ] || [ exp2 ]

    !:非关系

例子:if [ $# -gt 1 -a $# -le 3 ]  <–>  if [ $# -gt 1 ] && [$# -le 3 ]

if COMMAND ;then

  statement1

  …

else

  statement2

  …

fi

表示判断COMMAND的执行状态返回代码,正确执行为0,表示满足条件,执行COMMAND命令,错误执行为1-255,表示不满足条件。

2.case语句

case SWITCH in

value1)

  statement

  …

  ;;

valule2)

  statement

  …

  ;;

*)

  statement

  …

  ;;

esac

SWITCH中通常是变量的引用

value中的值可以接受 a-z A-Z 0-9 [abc] -v|–verbose等格式

循环结构:

1.for循环语句

for 变量 in 列表;do

  循环体

done

如何生成列表:

{1..100}

`seq 起始数 步进长度 结束数 `

for ((变量=初始值;判断条件;变量变化));do

  statement1

  …

done

2.while循环语句:满足条件后执行内部循环语句

while CONDITION;do

  statement1

  …

done

while :;do    无限循环

  statement1

  …

done

while read LINE;do   逐行读取到LINE中

  statement1

  …

done < /path/to/file

3.until循环语句:不满足条件后才执行内部循环语句

until CONDITION;do

  statement1

  …

done

function: 结构化编程,不能独立运行,需要调用时执行,可以被多次调用

定义一个函数:

function FUNCNAME {

  command

}

FUNCNAME() {

  command

}

函数中自定义执行状态返回值:

return # (0-255)

声明变量的属性

declare:如果不跟参数,相当于set

    -i:声明为整数

    -a:声明为数组

    -x:相当于export,定义环境变量

shell中的算术运算

A=3

B=6

1.let 算术运算表达式

    let C=$A+$B

2.$[算术表达式]

    C=$[$A+$B]

3.$((算术表达式))

    C=$(($A+$B))

4.expr 算术表达式,表达式中各操作数及运算符之间要有空格,而且要使用命令引用

    C=^expr $A + $B`

命令间的逻辑关系:

    逻辑与:&&

        第一个条件为假时,第二个条件不用在判断

        第一个条件为真时,第二个条件必须判断

    逻辑或:||

        第一个条件为真时,第二个条件不用判断

        第一个条件为假时,第二个条件必须判断

例子:[ `wc -l /etc/inittab | cut -d’ ‘ -f1` -gt 100 ] && echo “Large file.”

定义脚本执行状态返回码

exit:退出脚本

exit #:定义脚本执行状态返回码为#

如果脚本没有明确定义执行状态返回码,那么最后执行的一条命令的执行状态返回码即为脚本的执行状态返回码

从键盘读入,给变量赋值

read [OPTION] 变量

    -n:不换行显示

-p “string”:显示string的提示信息

-t #:设置超时时间

例子:read -p “请输入用户名:” USERNAME

测试脚本是否有语法错误

bash -n 脚本

bash -x 脚本:单步执行

#和%的特殊用法

${parameter#*word}:从左往右,取第一个word右边的字符

${parameter##*word}:从左往右,取最后一个word右边的字符

${parameter%word*}:从右往左,取第一个word左边的字符

${parameter%%word*}:从右往左,取最后一个word左边的字符

例子:

FILE=/usr/local/src

${FILE#*/}: usr/local/src

${FILE##*/}: src

${FILE%/*}: /usr/local

${FILE%%/*}:

${#VARNAME}:取变量中字符的长度

局部变量

local VAR_NAME= 

a=1

test() {

  a=$[3+4]

}

test

for I in `seq $a 10`; do

  echo $I

done  

结果是 7 8 9 10

a=1

test() {

  local a=$[3+4]

}

test

for I in `seq $a 10`; do

  echo $I

done  

结果是 1 2 3 4 5 6 7 8 9 10

信号

kill -SIGNAL PID

1:HUP

2:INT

9:KILL

15:TERM

脚本中能实现信号捕捉,但9和15无法捕捉

Ctrl+c相当于发送SIGINT信号

trap命令:bash的内建命令,捕捉信号并执行COMMAND

trap ‘COMMAND’ 信号列表(信号间用空格隔开):捕捉到信号列表中的信号,就执行COMMAND命令

例子:trap ‘echo ”no quit…”‘ INT

trap应用举例

#!/bin/bash
#
CLEANUP(){
	rm -rf /var/tmp/test
	echo "rm success..."
}
trap 'CLEANUP;exit 5' INT
#trap 'rm -rf /var/test;echo "rm success...";exit 5' INT
mkdir -p /var/tmp/test
while true;do
	touch /var/tmp/test/file-`date +%F-%H-%M-%S`

getopts:获取bash脚本中的选项和参数

格式:getopts optstrings 变量

getopts ":b:d:" OPT
echo $OPT     #打印选项,通常只打印第一个选项
echo $OPTARG  #打印选项参数

getopts中的特殊变量

OPTARG  #选项参数

OPTIND  #选项指针,为整数值,值等于所选定选项的位置+1

getopts应用举例

while getopts ":b:d:" SWITCH;do
  case $SWITCH in
    b) echo "The option is b"
	   echo $OPTARG;;
	d) echo "The option is d"
	   echo $OPTARG;;
	*) echo "Wrong option";;
  esac
done
shift $[$OPTIND-1]    #shift偏移,使得脚本中的$1为选项后的第一个独立参数

特殊符号的应用

$#表示传给脚本的参数个数

$0表示脚本本身的名字

$1表示传递给该shell脚本的第一个参数

$2表示传递给该shell脚本的第二个参数

$@表示传给脚本的所有参数的列表

$*表示以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个

$$表示脚本运行的当前进程ID号

$?表示显示最后命令的退出状态,0表示没有错误,其他表示有错误

bash中数组的应用

声明一个数组

declare -a array_name

数组赋值方法

array_name[#]=value  指定单个下标进行赋值

array_name=(value1 value2 value3…)  依次从下标0开始赋值

array_name=([0]=value1 [2]=value2 [5]=value3…)  指定多个下标进行赋值

打印方法

echo ${array_name[#]}

例子:INDEX=$[$RANDOM%7];echo ${aa[$INDEX]}

元素字符的长度

echo ${#array_name} 第0个元素的字符个数

echo ${#array_name[#]} 第#个元素的字符个数

echo ${#array_name[*]} 整个数组中值不为空的元素的个数

echo ${#array_name[@]} 整个数组中值不为空的元素的个数

数组应用举例

创建10个随机数存入数组,并找出数组中的最大数

#!/bin/bash
#
for I in {0..9};do
	ARRAY[$I]=$RANDOM
	echo -n "${ARRAY[$I]}"
	sleep 1
done
echo
declare -i MAX=${ARRAY[0]}
for I in `seq 1 ${#ARRAY[*]}`; do
	if [ $MAX -lt $ARRAY[$I] ];then
		MAX=${ARRAY[i]}
	fi
done
echo $MAX

生成一个数组,要求如下

1.数组的元素个数为1-39

2.数组元素不能相同

3.显示此数组各元素的值

#!/bin/bash
#
read -p "The element numbers:" ElENUM

function COMELE {
	for J in `seq 0 $[${#ARRAY[@]}-1]`;do
		if [ $1 -eq ${ARRAY[$J]} ];then
			return 1
		fi
	done
	return 0
}
ARRAY[0]=$RANDOM
for I in `seq 1 $[$ELENUM-1]`;do
  while true;do	
	ELEMENT=$RANDOM
	COMELE $ELEMENT
	if [ $? -eq 0];then
		break
	fi
  done
  ARRAY[$I]=$ELEMENT
done