Linux shell脚本编程
一、介绍
shell的两层含义:既是一种应用程序,又是一种程序设计语言
作为应用程序:
交互式地解释、执行用户输入的命令,将用户的操作翻译成机器可以识别的语言,完成相应功能
作为应用程序称之为shell命令解析器。shell是用户和Linux内核之间的接口程序,用户在提示符下输入的命令都由shell先解释然后传给Linux核心它调用 了系统核心的大部分功能来执行程序、并以并行的方式协调各个程序的运行
Linux系统中提供了好几种不同的shell命令解释器,如sh、ash、bash等。
一般默认使用bash作为默认的解释器
作为程序设计语言:
它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括 循环和分支完成类似于windows下批处理操作,简化我们对系统的管理与应用程序的 部署。
作为程序设计语言称之为shell 脚本。我们学过的c/c++等语言,属于编译性语 言。shell脚本是一种脚本语言,我们只需使用任意文本编辑器,按照语法编写相应 程序,增加可执行权限,即可在安装shell命令解释器的环境下执行
我们只需要将所有操作写入一个文——cmd.sh(名字跟后缀可任取,为了便于区分我们一般写为*.sh形式)
二、shell脚本的定义与执行
1、定义以开头:#!/bin/sh
#!用来声明脚本由什么shell解释,否则使用默认shell
2、注释:#
单个"#"号代表注释当前行
3、执行:三种
(1)增加可执行权限后执行
#chmod +x test.sh
./test.sh
(2)#bash test.sh 直接指定使用bash解释test.sh
(3)调用默认shell解释test.sh(.[空格]名字)
#. test.sh(source test.sh)
注:区别
(1) ./和bash执行过程基本一致,后者明确指定bash解释器去执行脚本,脚本中#!指定的解释器不起作用,前者首先检测#!,使用#!指定的shell,如果没有使用默认shell
(2)用./和bash去执行会在后台启动一个新的shell去执行脚本
(3)用.去执行脚本不会启动新的shell,直接由当前的shell去解释执行脚本
三、变量:自定义变量、环境变量、预设变量
1.自定义变量
(1)定义变量
变量名=变量值
如:num=10(等号两边不能直接接空格符)
(2)引用变量
$变量名
如:i=$num 把变量num的值付给变量i
(3)显示变量
使用echo命令可以显示单个变量取值
echo$num
(4)清除变量
使用unset命令清除变量
unset变量名
(5)变量的其它用法:
read string
从键盘输入一个字符串付给变量string,
若string没定义则先定义在使用
readonly var=100
定义一个只读变量,只能在定义时初始化,以后不能改变,不能被清除。
export var=300
使用export说明的变量,会被导出为环境变量,其它shell均可使用
注意:此时必须使用source 2_var.sh才可以生效
(6)注意事项:
1、变量名只能英文字母数字下划线,不能以数字开头
1_num=10错误
num_1=20 正确
2、等号两边不能直接接空格符,若变量中本身就包含了空格,则整个字符串都要用双引号、或单引号括起来;双引号内的特殊字符可以保有变量特性,但是单引号内的特殊字符则仅为一般字符。
name=aabb //错误
name="aa bb" //正确
echo "$name is me" //输出:aa bb is me
echo ' $name is me ' //输出:$name is me
2. 环境变量
(1)shell在开始执行时就已经定义了一些和系统的工作环境有关的变量,我们在shell中可以直接使用$name引用
(2)定义:
一般在~/.bashrc或/etc/profile文件中(系统自动调用的脚本)使用export设置,允许用户后来更改
VARNAME=value ;
export VARNAME
传统上,所有环境变量均为大写
(3)显示环境变量
使用env 命令可以查看所有的环境变量。
(4)清除环境变量
使用unset 命令清除环境变量
unset VARNAME
(5)常见环境变量:
HOME:用于保存注册目录的完全路径名。
PATH:用于保存用冒号分隔的目录路径名,shell将按PATH变量中给出的顺序搜索这些目录,找到的第一个与命令名称一致的可执行文件将被行。
PATH=$HOME/bin:/bin:/usr/bin;exportPATH
HOSTNAME:主机名
SHELL:默认的shell命令解析器
LOGNAME:此变量保存登录名
PWD:当前工作目录的绝对路径名
3. 预定义变量
$#:传给shell脚本参数的数量
$*:传给shell脚本参数的内容
$1、$2、$3、...、$9:运行脚本时传递给其的参数,用空格隔开
$?:命令执行后返回的状态
用于检查上一个命令执行是否正确
0表示该命正确执行
非0值表示命令出。
$0:当前执行的进程名
$$:当前进程的进程号
"$$"变量最常见的用途是用作临时文件的名字,以保证临时文件不会重复
执行 bash test.sh 1 3 5 7
4. 脚本变量的特殊用法:"" `` ' \ () {}
""(双引号):包含的变量会被解释
''(单引号):包含的变量会当做字符串解释
``(数字键1左面的反引号):反引号中的内容作为系统命令,并执行其内容,可以替 换输出为一个变量
$ echo "today is `date` "
todayis 2012年07月29日星期日 12:55:21CST
\ 转义字符:同c语言 \n \t \r \a等echo命令需加-e转义
(命令序列):由子shell来完成,不影响当前shell中的变量
{ 命令序列 }:在当前shell中执行,会影响当前变量, “{”、“}”前后有一空格
四、条件测试语句: 文件、字符串、数字、复合测试
(1)在写shell脚本时,经常遇到的问题就是判断字符串是否相等,可能还要检查文 件状态或进行数字测试,只有这些测试完成才能做下一步动作
(2)test命令:用于测试字符串、文件状态和数字
(3)test命令有两种格式:
test condition 或[ condition ]
使用方括号时,要注意在条件两边加上空格
(4)shell脚本中的条件测试如:文件测试、字符串测试、数字测试、复合测试
(5)测试语句一般与后面讲的条件语句联合使用
(6)文件测试:测试文件状态的条件表达式
-e 是否存在 -d 是目录 -f 是文件 -r 可读 -w 可写 -x 可执行
-L 符号连接 -c是否字符设备 -b是否块设备 -s 文件非空
(7)字符串测试:
test str_operator“str”
test “str1” str_operator “str2”
[ str_operator “str” ]
[ “str1” str_operator “str2”]
其中str_operator可以是:
= 两个字符串相等
!= 两个字符串不相等
-z空串
-n 非空串
(8)测试数值格式如下:
test num1num_operator num2
[ num1 num_operator num2 ]
num_operator可以是:
-eq 数值相等
-ne 数值不相等
-gt 数num1大于数num2
-ge 数num1大于等于数num2
-le 数num1小于等于数num2
-lt 数num1小于数num2
(10)命令执行控制
&&:command1&& command2
&&左边命令(command1)执行成功(即返回0)
shell才执行&&右边的命令(command2)
||:command1|| command2
||左边的命令(command1)未执行成功(即返回非0)
shell才执行||右边的命令(command2)
test -e /home && test -d /home&& echo "true"
五、控制语句
(1)if[条件1];
then 执行第一段程序
else
执行第二段程序
fi
(2)if [条件1];
then执行第一段程序
elif [条件2];
then执行第二段程序
else
执行第三段程序
fi
(3)case $变量名称 in
“第一个变量内容”)
程序段一
;;
“第二个变量内容”)
程序段二
;;
*)
其它程序段
exit 1
esac
(4)for (( 初始值; 限制值; 执行步阶 ))
do
程序段
done
declare是bash的一个内建命令,可以用来声明shell变量、设置变量的属性。 declare也可以写作typeset。
declare -i s 代表强制把s变量当做int型参数运算。
(5)for varin con1 con2 con3 ...
do
程序段
done
第一次循环时,$var的内容为con1
第二次循环时,$var的内容为con2
第三次循环时,$var的内容为con3
......
(6)while [condition ]
do
程序段
done
当condition成立的时候进入while循环,
直到condition不成立时才退出循环。
(7)until [condition ]
do
程序段
done
与while相反,当condition成立的时候退出循环,否则继续循环。
(8)break
break 命令允许跳出循环,通常在进行一些处理后退出循环或case语句
(9)continue
continue不会跳出循环,只是跳过这个循环步
六、函数
1. 定义函数的两种格式:
(1)函数名() {
命令 ...
}
(2)function 函数名() {
命令 ...
}
2.函数可以放在同一个文件中作为一段代码,也可以放在只包含函数的单独文件中
3. 所有函数在使用前必须定义,必须将函数放在脚本开始部分
4. 调用函数的格式为:
函数名 param1 param2……
使用参数同在一般脚本中使用特殊变量$1,$2 ...$9一样
5. 函数可以使用return 提前结束并带回返回值
return 从函数中返回,用最后状态命令决定返回值。
return 0 无错误返回
return 1 有错误返回