脚本定义
脚本就是一个包含一系列命令的文本文件。当运行这个脚本文件时,文件中包含的命令序列将得到自动执行。
脚本编程
1.基本结构
脚本由解析器和命令序列组成,#!/bin/bash指明了脚本由哪个解析器解析运行。创建脚本文件,并更改权限为可执行。注意:文本格式要转换为Unix格式。
2.变量
shell脚本允许用户设置和使用自己的变量,变量可以是数字或字符串,用户无需指定其类型,也无需在使用前定义。在使用变量时需要加美元符,在对变量赋值时不需要加美元符,和赋值号’=’之间不能有空格。
a="hello world!" b=100 echo "a is $a" echo "b is $b"
3.参数
shell脚本中可以使用命令行参数
$#: 命令行参数个数
$*: 命令行全部参数,各参数之间用空格隔开
$0: 命令行第一个参数(shell文件名)
$1: 命令行第二个参数
$2: 命令行第三个参数
echo "argc is $#" echo "argv is $*" echo "argv[0] is $0" echo "argv[1] is $1" echo "argv[2] is $2"
4.运算
shell脚本提供了一个专门的命令expr来计算数学表达式,例如expr 5+1,但是当要把计算的结果赋值给其他变量时,还必须使用反引号。例如var=`expr 5+1`
x=1 y=2 z=`expr $x + $y` echo "x + y = $z"
4.选择
shell脚本中最基本的流程控制语句就是if-then,使用格式:
if [ condition ] (注意:方括号左右两边必须有空格) then command else command fi
比较操作 整数操作 字符串操作
相同 -eq =
不同 -ne !=
大于 -gt >
小于 -lt <
小于 -lt <
大于或等于 -ge
小于或等于 -le
为空 -z
不为空 -n
示例:
比较整数a和b是否相等:if [ $a = $b ] ( 也可用 eq)
判断整数a是否大于整数b:if [ $a - gt $b ]
比较字符串a和b是否相等:if [ $a = $b ]
判断字符串a是否为空:if [ - z $a ]
判断字符串a是否为空:if [ - z $a ]
判断整数变量a是否大于b:if [ $a - gt $b ]
注意:
1. 在“[”和“]”符号的左右都留有空格
2. “=”左右都有空格
-e 文件已经存在
-f 文件是普通文件
-s 文件大小不为零
-d 文件是一个目录
-r 文件对当前用 户可以读取
-w 文件对当前用 户 可以写入
-x 文件对当前用 户 可以执行
示例:
#!/bin/sh
folder=/home
[ -r "$folder" ] && echo "Can read $folder" #当条件为真执行显示
[ -f "$folder" ] || echo "this is not file" #当条件为假执行显示
if [ $1 -gt $2 ] then echo "max is argv[1]" else echo "max is argv[2]" fi
5.循环
5.1.shell脚本提供了for命令,用于创建类似于C语言中for语句一样的循环。格式:
for var in list do command done
示例:
list="Sun Mon Tue Wed Thu Fri Sat" for day in $list do echo $day done
5.2.shell脚本提供了while命令,用于创建类似于C语言中while语句一样的循环。格式:
while [ condition ] do command done
num=0 while [ $num -lt 7 ] do echo $num num=`expr $num + 1` done
6.sed编辑器
sed(Stream Editor):流格式编辑器又名行编辑器,每次只编辑一行,使用格式:
sed [操作选项] ‘命令’文件名
操作选项:
-n:处理后只显示改行
-e:进行多项编辑任务
-i:直接修改读取内容,如果不使用该命令则不会修改源文件
命令选项:
p:打印匹配行
a:新增
c:替代一行
d:删除一行
s:替代一行中的某一部分
示例:
1.显示
sed -n '2'p tmp.txt 只显示第 2行
sed -n '1,3'p temp.txt 打印第 1行到第 3行
sed -n '/mov/'p temp.txt 打印含movie的行
2.删除
sed ‘2’d tmp.txt 删除第 2行
sed ‘3,$’d tmp.txt 删除第 3行到最后一行, $:最后一行
3.查询
sed -n ‘/hello/’p tmp.txt 查询包括关键字hello的所有行
4.代替
sed ‘1c Hi’ tmp.txt 第 1行代替为Hi
sed -n ' /hello/p' tmp.txt | sed ' s/hello/bird/g'
5.插入
sed -i ‘$a bye’ tmp.txt 在最后一行插入bye
7.awk分析器
awk是一个强大的文本分析工具,它能把文件逐行读入,比空格为默认分割方式将每行分割给多个字段。
使用方法:
awk ‘pattern + action’ filename
pattern:查找的内容
action:执行的操作
示例:
1.查看last命令显示的第一列
last -n 5 | awk '{print $1}'
2.查看cat命令显示的以’:’分割的第一行
cat /etc/passwd | awk -F ':' '{print $1}'
3.查看/etc/passwd文件显示的以’:’分割的,并且第一列等于”root”的所有列
awk -F ':' '$1=="root" {print $1}' /etc/passwd
shell.sh
#!/bin/bash #变量 a="hello world!" b=100 echo "a is $a" echo "b is $b" #参数 echo "argc is $#" echo "argv is $*" echo "argv[0] is $0" echo "argv[1] is $1" echo "argv[2] is $2" #运算 x=1 y=2 z=`expr $x + $y` echo "x + y = $z" #选择 if [ $1 -gt $2 ] then echo "max is argv[1]" else echo "max is argv[2]" fi #循环 list="Sun Mon Tue Wed Thu Fri Sat" for day in $list do echo $day done num=0 while [ $num -lt 7 ] do echo $num num=`expr $num + 1` done