[国嵌攻略][095][脚本编程技术]

脚本定义

脚本就是一个包含一系列命令的文本文件。当运行这个脚本文件时,文件中包含的命令序列将得到自动执行。

 

脚本编程

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

 

posted @ 2016-03-02 16:37  盛夏夜  阅读(357)  评论(0编辑  收藏  举报