shell编程

时间:2024.4.8

实验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 编程题


例题:

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编程实验报告

南京信息工程大学实验实习报告实验目的1了解和熟悉创建并使用脚本的步骤2熟悉bash的控制结构3学会简单的shell编程实验内容1创建一个简单的列目录和日期的shell脚本并运行之步骤输入下列命令创建一个新文件c...

LINUX-Shell编程实验报告

LINUX管理与应用课程实验报告

linux操作系统实验报告_shell简单编程

操作系统实验报告院系机电与信息工程学院实验日期20xx年xx月x日

Linux操作系统(实验五shell编程实验报告)

信息技术学院软件实验报告专业软件工程课程Linux操作系统学号姓名班级软件工程班

LINUX-shell程序编程实验报告

LINUX实验报告专业班级学号姓名报告时间1实验一Shell编程一实验名称考勤模拟shell程序设计二实验目的理解Shell程序的设计方法熟悉Shell程序的编辑运行调试方法与过程三实验内容考勤模拟Shell程...

shell编程实验报告

实验报告课程名称linux教程实验项目shell编程专业班级网络工程xxx指导教师xxx姓名xxxx学号xxx成绩日期xxxx12

实验4 shell 程序设计 实验报告

实验4shell程序设计1采用shell编程语言类似C语言完成1请用C语言编写程序将1100之间能被3或7整除的数显示出来实验结果studentlinuxsusegthomework1sh36791214151...

实验03- Linux Shell编程

操作系统实验报告实验序号3实验项目名称LinuxShell编程

实验二Linux shell编程

湖北工业大学工程技术学院实验报告课程名称操作系统实验内容实验二LinuxShell编程学院工程技术学院专业班级09gb计算机一班姓名匡鑫学号0915023134教师成绩一实验目的1掌握Linux环境shell程...

网络实验6Socket编程实现聊天程序

南昌航空大学实验报告课程名称计算机网络实验名称Socket编程实现聊天程序班级090451班学生姓名杨望学号09045131指导教师评定签名一实验目的1掌握网络应用程序的开发方法2掌握ClientServer结...

WinSocket编程实验报告

实验六WinSock编程实验报告1实验目的和要求1学习网络中进程之间通信的原理和实现方法2掌握在VB或VC等集成开发环境中编写网络程序的方法3编写一个简单的聊天程序最低要求实现两人一组的两台计算机之间的收发文本...

ch33 实验十七 网络编程(一)Socket通信

J2ME程序设计之网络编程一Socket通信J2ME程序设计之网络编程一Socket通信J2ME程序设计之网络编程一Socket通信J2ME程序设计之网络编程一Socket通信J2ME程序设计之网络编程一Soc...

shell编程实验报告(25篇)