shell编程

来源:m.fanwen118.com时间:2021.9.29

实验X shell编程(1)

一、实验目的

1、了解shell的概念、shell程序的作用

2、了解shell变量的种类及其使用

3、理解和掌握条件测试的原理和方法

4、掌握用vi、gedit等编辑器创建shell脚本的方法

5、掌握shell脚本的执行方法

二、预备知识

1、Linux系统的Shell

从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁。用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操作。在Linux GUI日益完善的今天,在系统管理等领域,Shell编程仍然起着不可忽视的作用。深入地了解和熟练地掌握Shell编程,是每一个Linux用户的必修功课之一。使用Linux系统时,用户多数时间是通过Shell与系统进行对话的,它是用户与Linux系统之间的界面之一。

Linux系统中可以使用的Shell包括:

1) bash:Bourne Again Shell。这是Linux系统上最常用的Shell,它合乎POSIX标准

且相容于Bourne Shell,提供了编辑命令行的功能。

2) csh:C Shell。由Berkeley (伯克利大学) 开发,与Bourne Shell在交互式使用上很

多是相兼容的,但在程序设计界面上却有很大的不同。它不提供编辑命令行的功能,但它有类似的功能叫命令历史记录

3) ksh:Korn Shell。在UNIX系统下得到普遍使用,并最早将现代Shell技术 (包括

取自C Shell的部分) 引入Bourne Shell,提供了编辑命令行功能

4) sh:Bourne Shell。是原始的Shell,不提供编辑命令行功能

5) tcsh:C Shell的加强版,提供了编辑命令行的功能

6) zsh:Z Shell。最新的Shell,与Bourne Shell兼容,提供编辑命令行的功能。 一般默认的shell是bash Shell。

三、实验内容

1.Shell变量的定义及其使用。

2.位置参数和环境变量。

3.Shell中的特殊字符。

四、实验步骤

(一)Shell变量

Shell有三种变量:内部变量、环境变量和临时变量。在Shell脚本中临时变量又分为两类:用户定义的变量和位置参数。

1、常用的内部变量。返回值为0代表为真,非0值均为假。

1) # :传给shell程序位置参数的个数

2) ?:存储上一个执行命令的返回值

3) 0: 存储shell程序的名称

4) *: 存储shell程序的所有参数

例如:

1) echo "Number of parameters is:"$#

2) echo "Program name is:"$0

3) echo "Parameters as a single string is:"$*

2、常用的环境变量:

1) HOME: 用户的主目录

2) PATH: 执行命令时所搜索的路径

3) PS1: shell命令行的一级提示符

4) PS2: shell命令行的二级提示符

用 printenv 命令查看当前起作用的环境变量列表,如:

$printenv

列出的环境变量中最重要的是$PATH,它指定了查找可执行程序的路径顺序。例如,如果运行ifconfig检查某个连接状态,而提示命令没找到,其原因是shell的环境变量里没有设置这条路径名。解决办法是:

$whereis ifconfig

$/sbin/ifconfig

在命令行中使用export命令把/sbin目录加到$PATH变量中:

$PATH=$PATH:/sbin;export PATH

$ifconfig

但这是暂时的,仅维持本次登陆执行了export有效。要长期有效必须修改/etc/profile或

主目录下.bash_profile文件中的环境变量。

3、用户定义的变量

用户定义的变量是最普遍的Shell变量,变量名是以字母或下化线打头的字母、数字和下线字符序列,并且大小写字母意义不同。变量名的长度不受限制。定义变量并赋值的一般形式是: 变量名=字符串

例如, myfile=/usr/meng/ff/m1.c

在程序中使用变量的值时,要在变量名前面加上一个符号“$”。这个符号告诉Shell要读取该变量的值。

4、位置参数

执行Shell脚本时可以使用参数。由出现命令行上的位置确定的参数称做位置参数。在sh中总共有十个位置参数,其对应的名称依次是$0,$1,$2,...$9。其中$0始终表示命令名或Shell脚本名,对于一个命令行,必然有命令名,也就必定有$0;而其它位置参数依据实际需求,可有可无。

(二) SHELL中的特殊字符

1、通配符

通常的通配符有三种:

1) * 星号,它匹配任意字符的.)和

路径名中的斜线(/)必须显示匹配。

2) ?问号,它匹配任意一个字符。

3) [] 一对方括号,其中有一个字符组。其作用是匹配该字符组所限定的任意一个字

符。

4) 应该注意:字符 * 和 ?在一对方括号外面是通配符,若出现在其内部,它们就失

去通配符的能力了。

5) !叹号,若它紧跟在一对方括号的左方括号[之后,则表示不在一对方括号中所列

出的字符。

2、引号

在SHELL中引号分为三种:单引号、双引号、和倒引号。

1) 双引号

由双引号括起来的字符,除$、倒引号和反斜线(\)仍保留其功能外,其余字符通常作为普通字符对待。

2) 单引号

由单引号括起来的字符都作为普通字符出现。

3) 倒引号

例如:

$ today=`date`

$echo Today is $ today

Today is Thu May 04 10 :56 :20 CST 2014

4) 反斜线

转义字符,若想在字符串中使用反斜线本身,则必须采用(\\)的形式,其中第一个反斜线作为转义字符,而把第二个反斜线变为普通字符。

(三)条件测试

1、字符串比较

1) = 比较两个字符串是否相等

2) != 比较两个字符串是否不相等

3) -n 判断字符长度是否大于零

4) -z 判断字符长度是否等于零

2、数字比较

1) -eq 比较两个数是否相等

2) -ge 比较一个数是否大于或是等于另一个数

3) -le 比较一个数是否大于或是等于另一个数

4) -ne 比较两个数是否不等

5) -gt 比较一个数是否大于另一个数

6) -lt 比较一个数是否小于另一个数

3、文件操作符

1) -d 确定文件是否为目录

2) -f 确定文件是否为普通文件

3) -r 确定是否对文件设置了读许可

4) -s 确定文件名是否具有大于零的长度

5) -w 确定文件是否设置了写许可

6) -x 确定文件是否设置了执行许可

测试语句:

有两种常用形式:一种是用test命令,如上所示。另一种是用一对方括号将测试条件括起来。两种形式完全等价。例如,测试位置参数$1是否是已存在的普通文件,可写成:test -f " $1",也完全可写成:[ -f $ l ]

在格式上应注意,如果在test语句中使用shell变量,为表示完整、避免造成歧异起见最好用双引号将变量括起来。利用一对方括号表示条件测试时,在左方括号[之后、右方括号]之前各应有空格。

(四)创建简单shell程序

1、进入vi或gedit编辑器

2、编写程序

例:

#!/bin/bash

hello()

{

echo "hello there today's date is:`date`"

}

echo "now going to the function hello"

hello

echo "back from the function"

#end

(五)执行shell程序的方法

方法一 : 加执行权后,程序完整路径引导。 ($chmod u+x filename)

方法二 : shell解释器名称引导。

方法三: 点空格引导。

方法四 : 使用命令替换。

五、实验报告要求

1、整理实验结果,使其分别与相应的命令对应

2、记录程序设计的流程

3、根据实验步骤,写出实验报告

实验x shell编程(2)

一、实验目的

1、掌握if、case等条件语句的使用

2、掌握for、while、until等循环语句的使用方法

3、理解和掌握shift及其它语句的使用方法

二、实验准备

1、硬件:笔记本电脑或台式机电脑;

2、软件:Linux 红帽、ubuntu、麒麟等操作系统。

三、相关知识

1. if 语句

if语句通过判断逻辑表达式来作出选择,在bash中的条件语句有如下的格式: if [ expression ]; then

statements

elif [ expression ]; then

statements

else

statements

fi

if条件语句是可以嵌套的。

2. case语句

case语句是用来执行依赖于离散值或是匹配指定变量值的范围的语句。格式如下: case str in

str1)

statements

……

statements;;

str2)

statements

……

statements;;

str3)

statements

……

statements;;

str4)

statements

……

statements;;

*)

Statements

……

statements;;

esac

3.for语句

for var in {list}

do

statements

done

对list中的每个值需要执行一次statements时应利用这种格式。对每次循环,把list中的当前值赋给变量var。List可以使含有几个项的变量,或是用空格分隔的值表。

4. while语句

在pdksh和bash 中,利用的如下的格式:

while expression

do

statements

done

5.简单程序

1)if语句例子程序

#!/bin/bash

# 提示用户输入份数(0~100)

echo “please input a integer”

read score

# 判断学生的分数类别

if [“$score” –lt 0 –o –gt 100]

then

echo “the score what you input is not integer or the score is not ”

elif [“$score” -ge 90]

then

echo “the grade is A!”

elif [“$score” –ge 80]

then

echo “the grade is B!”

elif [“$score” –ge 70]

then

echo “the grade is C!”

elif [“$score” –ge 60]

then

echo “the grade is D!”

else

echo “the grade is E!”

fi

四、实验内容及步骤

1. 求前五个偶数的和

参考程序:

#!/bin/bash

loopcount=0

result=0

while [ $loopcount –lt 5 ]

do

loopcount=?expr $loopcount +1?

increment=?expr $loopcount \*2?

result= ?$result + $increment?

done

echo "result is $result“

2.设计一个shell程序,添加一个新组为class1,然后添加属于这个组的30个用户,用户名的形式为stdxx,其中xx从01到30。

参考程序:

#!/bin/sh

i=1

groupadd class1

while [ $i -le 30 ]

do

if [ $i -le 9 ] ;then

username=stu0${i}

else

username=stu${i}

fi

useradd $username

mkdir /home/$username

chown -r $username /home/$username

chgrp -r class1 /home/$username

i=$(($i+1))

done

3.编写shell程序,实现自动删除50个账号的功能。账号名为stud1至stud50。 参考程序:

#!/bin/sh

i=1

while [ $i -le 50 ]

do

userdel -r stud${i}

i=$(($i+1 ))

done

五、实验报告要求

1.记录实验中遇到的问题

2.提出程序的改进方法

3.根据实验步骤,写出实验报告


第二篇:Shell 编程题 3100字

例题:

shell1.sh 显示日期和时间。

#!/bin/bash

echo “current time is `date`” //date要加反引号

shell2.sh 显示文件名,并显示位置参数(执行时带一个参数)。(①$0是一个特殊的变量,它的内容是当前这个shell程序的文件名;②$1是一个位置参数,位置参数之间用空格分隔,shell取第一个位置参数替换程序文件中的$1,第二个替换$2,依次类推。)

#!/bin/bash

echo “the program name is $0” //$0是一个特殊的变数

echo “the first para is $1” //$1是一个位置参数

echo “the program exit” //执行时带一个参数 如./shell2.sh abcd

shell3.sh 判断并显示位置参数

#!/bin/bash if [ -d “$1”];then echo “$1 is directory ,existed” else echo “$1 does not exist ,now create it” mkdir $1 echo “$1 is created” fi //执行时带一个参数

shell4.sh 问候用户

#!/bin/bash

user=`whoami`

case $user in

teacher)

echo “hello teacher”;;

root)

echo “hello root”;;

*) echo “hello $user,welcome” esac

1、 求1+2+3+...+100的和是?

#!/bin/bash

SUM=0

I=0

while [ $I -le 100 ]

do

SUM=$((SUM+I))

I=$((I+1))

done

echo "由1+2+3+...+100的和是:$SUM"

2、(基训十一) 在根目录下有四个文件m1.txt,m2.txt,m3.txt,m4.txt,用Shell编程,实现自动创建m1,m2,m3,m4四个目录,并将m1.txt,m2.txt,m3.txt,m4.txt四个文件分别拷贝到各自相应的目录下。

#!/bin/bash

cd /

touch m1.txt m2.txt m3.txt m4.txt

I=1

while [ $I -le 4 ]

do

mkdir m$I

cp m$I.txt m$I

I=$((I+1))

done

3、(基训十二) 编写一个名为myfirstshell.sh的脚本,它包括以下内容。a) 包含一段注释,列出您的姓名、脚本的名称和编写这个脚本的目的。

b) 问候用户。

c) 显示日期和时间。

d) 显示这个月的日历。

e) 显示您的机器名。

f) 显示当前这个操作系统的名称和版本。 g) 显示父目录中的所有文件的列表。

h) 显示root正在运行的所有进程。

i) 显示变量TERM、PATH和HOME的值。 j) 显示磁盘使用情况。

k) 用id命令打印出您的组ID。

m) 跟用户说“Good bye”

#!/bin/bash

# 09嵌入 5号 贾德进 myfirstshell.sh shell的简单编程 user=`whoami`

case $user in

root)

echo "hello root";;

teacher)

echo "hello teacher";;

*)

echo "hello $user,welcome"

esac

echo "日期和时间: `date`"

echo "本月的日历: `cal`"

echo "本机的机器名:`uname -n`"

echo "当前这个操作系统的名称和版本:`uname -s;uname -r`" echo "父目录中的所有文件的列表:`ls ../`"

echo "root正在运行的所有进程:` ps -u root`"

echo "变数TERM的值:$TERM"

echo "变数PATH的值:$PATH"

echo "变数HOME的值:$HOME"

echo "磁盘的使用情况:`df`"

echo "用id命令打印出你的组ID:`id -g`"

echo "Good bye!"

4、(基训十三) 设计一个Shell程序,在/userdata目录下建立50个目录,即user1~user50,并设置每个目录的权限为 rwxr-xr—

#!/bin/bash

cd /userdata

I=1

while [ $I -le 50 ]

do

mkdir -p userdata/user$I

chmod o-x user$I

I=$((I+1))

done

5、(基训十四) 编写shell程序,实现自动删除50个用户账号的功能。账号名为stud1至stud50。

#!/bin/bash

cd /userdata

I=1

while [ $I -le 50 ]

do

mkdir -p userdata/user$I

chmod o-x user$I

I=$((I+1))

done

6、(基训十四) 设计一个shell程序,备份并压缩/etc目录的所有内容,存放在/root/bak目录里,且文件名为如下形式yymmdd_etc,yy为年,mm为月,dd为日。

#!/bin/bash

DIRNAME=`ls |root|grep bak `

if [-z $DIRNAME ]; then

mkdir /root/bak

cd /root/bak

fi

YY=`date + %y`

MM=`date + %m`

DD=`date + %d`tar czvf ${YY}${MM}${DD}_etc.gz /etc

echo "etc bak finshied"

7、(基训十四) 某系统管理员需每天做一定的重复工作,请按照下列要求,编制一个解决方案:

(1)在下午4 :50删除/abc目录下的全部子目录和全部文件;

(2)下午5:50将/data目录下的所有目录和文件归档并压缩为文件:backup.tar.gz;

(3)在下午5:55将IDE接口的第二个逻辑分区卸载。

// 采用: vi pram.cron

#(1) 在下午4:50删除/abc目录下的全部子目录和全部文件;

50 16 *** rm -rf /abc/*

#(2) 下午5:50将/data目录下的所有目录和文件归档并压缩为文件:backup.tar.gz; 50 17 *** tar czvf back.tar.gz /data

#(3) 在下午5:55将IDE接口的第二个逻辑分区卸载.

55 17 *** umount /dev/hda6

// 执行:crontab pram.cron

更多类似范文
┣ SHELL编程讲义 19900字
┣ 更多shell编程实验报告
┗ 搜索类似范文