Shell 编程

Shell 编程

 

课程大纲

 Shell编程语法

 Shell脚本调试

 Shell应用实例

 

一个简单的shell程序

$ cat example

#!/bin/sh

#This is to show what a example looks like.

echo "Our first example"

echo # This inserts an empty line in output.

echo "We are currently in the following directory."

/bin/pwd

echo

echo "This directory contains the following files"

/bin/ls

 

shell 结构:

1. #!指定执行脚本的shell

2. #注释行

3. 命令和控制结构

创建shell 程序的步骤:

第一步:创建一个包含命令和控制结构的文件。

第二步:修改这个文件的权限使它可以执行。

使用chmod u+x

第三步:执行./example

(也可以使用"sh example"执行)

 

Shell变量

变量:是shell传递数据的一种方法,用来代表每个取值的符号名。

Shell有两类变量:临时变量和永久变量。

临时变量是shell程序内部定义的,其使用范围仅限于定

义它的程序,对其它程序不可见。包括:用户自定义变

量、位置变量。永久变量是环境变量,其值不随shell脚

本的执行结束而消失。

用户自定义变量

用户定义的变量由字母或下划线开头,由字母、

数字或下划线序列组成,并且大小写字母意义不

同。变量名长度没有限制。

在使用变量值时,要在变量名前加上前缀"$"。

设置和使用变量

设置变量:习惯上用大写字母来命名变量。变量名只能

以字母表中的字符开头,不能用数字。

变量赋值:赋值号"="两边应没有空格。

定义时赋值,如NUM=1

将一个命令的执行结果赋给变量,如:TIME=`date`

将一个变量赋给另一个变量,如:A =$B

使用echo命令查看变量值。例如:echo $A

    

列出所有的变量:# set

包含多个字的变量:$NAME=Mike Ron

运行时出错,应改为:$NAME="Mike Ron" 或 $NAME='Mike Ron'

 

    单引号和双引号的区别:

# $ABC='$NAME Junior'

# echo $ABC

$NAME Junior

单引号之间的内容原封不动地指定给了变量。

删除变量:# unset NAME

 

位置变量和特殊变量

Shell解释执行用户命令时,将命令行的第一个

部分作为命令名,其它部分作为参数。由出现

在命令行上的位置确定的参数称为位置参数。

例如:

ls -l file1 file2 file3

$0 这个程序的文件名 ls -l

$n 这个程序的第n个参数值,n=1-9

 

特殊变量

$* 这个程序的所有参数

$# 这个程序的参数个数

$$ 这个程序的PID

$! 执行上一个后台命令的PID

$? 执行上一个命令的返回值

 

Shell命令

read命令:从键盘读入数据,赋给变量

如:read USERNAME

 

read 命令

read 的例子:

#! /bin/sh

read first second third

echo "the first parameter is $first"

echo "the second parameter is $second"

echo "the third parameter is $third"

 

expr 命令

Shell变量的算术运算:

expr命令:对整数型变量进行算术运算

例如:expr 3 + 5

expr $var1 - 5

expr $var1 / $var2

expr $var3 * 10

 

复杂的expr命令

复杂的运算:

expr `expr 5 + 7`/$var4

将运算结果赋予变量:

var4=` expr $var1 / $var2 `

 

expr 命令

#!/bin/sh

a=10

b=20

c=30

value1=`expr $a + $b + $c`

echo "The value of value1 is $value1"

value2=`expr $c / $b`

echo "The value of value2 is $value2"

value3=`expr $c * $b`

echo "The value of value3 is $value3"

value4=`expr $a + $c / $b`

echo "The value of value4 is $value4"

 

变量测试语句

变量测试语句:用于测试变量是否相等、 是否为空、文件类型等。

格式:

test 测试条件

测试范围:整数、字符串、文件

 

字符串测试:

test str1=str2 测试字符串是否相等

test str1!=str2 测试字符串是否不相等

test str1 测试字符串是否不为空

test -n str1 测试字符串是否不为空

test -z str1 测试字符串是否为空

 

整数测试:

test int1 -eq int2 测试整数是否相等

test int1 -ge int2 测试int1是否>=int2

test int1 -gt int2 测试int1是否>int2

test int1 -le int2 测试int1是否<=int2

test int1 -lt int2 测试int1是否<int2

test int1 -ne int2 测试整数是否不相等

 

文件测试:

test -d file 指定文件是否目录

test -f file 指定文件是否常规文件

test -x file 指定文件是否可执行

test -r file 指定文件是否可读

test -w file 指定文件是否可写

test -a file 指定文件是否存在

test -s file 文件的大小是否非0

 

变量测试语句一般不单独使用,一般做为if语句

的测试条件,如:

if test -d $1 then

fi

变量测试语句可用[]进行简化,如

test -d $1 等价于[ -d $1 ]

 

#!/bin/sh

if [ $# -ne 2 ]; then

echo "Not enough parameters"

exit 0

fi

if [ $1 -eq $2 ]; then

echo "$1 equals $2"

elif [ $1 -lt $2 ]; then

echo "$1 littler than $2"

elif [ $1 -gt $2 ]; then

echo "$1 greater than $2"

fi

 

流控制语句

流控制语句:用于控制shell程序的流程

exit语句:退出程序执行,并返回一个返回码,返

回码为0表示正常退出,非0表示非正常退出。

例如:exit 0

 

流控制语句

if语句的流程图

 

 

if …then …fi语句,例如:

#!/bin/sh

if [ -x /etc/rc.d/init.d/httpd ]

then

/etc/rc.d/init.d/httpd restart

fi

 

if/else语句的流程图

 

 

更复杂的if语句:

if 条件1 then

命令1

elif 条件2 then

命令2

else

命令3

fi

 

if/else嵌套的流程图

 

多个条件的联合:

-a:逻辑与,仅当两个条件都成立时,结果为真。

-o:逻辑或,两个条件只要有一个成立,结果为真。

 

echo "please input a file name:"

read file_name

if [ -d $file_name ]

then

echo "$file_name is a directory"

elif [ -f $file_name ]

then

echo "$file_name is a common file"

elif [ -c $file_name -o -b $file_name ]

then

echo "$file_name is a device file"

else

echo "$file_name is an unknown file"

fi

 

for…done语句

格式:for 变量in 名字表

do

命令列表

Done

 

例子:

#!/bin/sh

for DAY in Sunday Monday Tuesday Wednesday

Thursday Friday Saturday

do

echo "The day is : $DAY"

done

 

select 变量 in 关键字

do

 command 1

 ... ...

 command n

done

select把关键字中的每一项做成类似表单,以交互的

方式执行do和done之间的命令。

 

case…esac语句,格式:

case 变量

in

字符串1) 命令列表1

;;

...

字符串n) 命令列表n

;;

esac

 

 

while语句,格式:

while 条件

do

命令

done

 

#! /bin/sh

num=1

while [ $num -le 10 ]

do

SUM=`expr $num * $num`

echo $SUM

num=`expr $num + 1`

done

 

until语句,格式:

until 条件

do

命令

done

until类似while循环,不同的是until是条件返回值为

假时才继续执行 。

 

跳出循环:break和continue

break:跳出整个循环

continue:跳过本次循环,进行下次循环

 

shift指令:参数左移,每执行一次,参数序列顺

次左移一个位置,$#的值减1,

用于分别处理每个参数,移出去的参数不再可用

 

#! /bin/sh

if [ $# -le 0 ]

then

echo "Not enough parameters"

exit 0

fi

sum=0

while [ $# -gt 0 ]

do

sum=`expr $sum + $1`

shift

done

echo $sum

 

函数应用

函数的定义:

函数名 ()

{

命令序列

}

函数的调用:不带()

函数名

参数1 参数2 …

 

函数中的变量:

变量均为全局变量,没有局部变量

函数中的参数:调用函数时,可以传递参数,在函

数中用$1、$2…来引用

 

Shell 脚本调试

sh -x script

这将执行该脚本并显示所有变量的值。

sh -n script

不执行脚本只是检查语法的模式,将返回

所有语法错误。

 

awk命令应用

awk -F 域分隔符 '命令'

示例:

1、检测系统中UID为0的用户

awk -F: '$3==0 {print $1}' /etc/passwd

2、检测系统中密码为空的用户

awk -F: 'length($2)==0 {print $1}' /etc/shadow

 

知识点总结

 掌握Shell编程的基本语法

 掌握结合系统命令编写应用脚本

 掌握Shell编程调试命令

博主QQ 343264992 QQ群交流:100411237 添加时候请备注博客园
原文地址:https://www.cnblogs.com/chengkanghua/p/9236567.html