实验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.根据实验步骤,写出实验报告
例题:
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
南京信息工程大学实验实习报告实验目的1了解和熟悉创建并使用脚本的步骤2熟悉bash的控制结构3学会简单的shell编程实验内容1创…
LINUX实验报告专业班级学号姓名报告时间1实验一Shell编程一实验名称考勤模拟shell程序设计二实验目的理解Shell程序的…
在安全生产事故警示教育周期间,我队积极组织全队干部员工认真学习了集团公司发生的三起死亡事故案例以及我矿发生的掘进队、运输工区和“9…
20xx年第一季度职业培训工作总结一、职业培训任务完成情况全年计划培训38000人,其中,城镇各类人员培训15200人,农村劳动力…
检验科科室20xx年度总结和20xx年计划一、20xx年主要工作成绩。1.三级医院创建措施和取得成绩。20xx年,三级医院的创建工…
生命诚宝贵,安全无小事。今年以来,在各级领导的大力支持和帮助下,我们认真贯彻落实上级一系列安全指示精神,坚持“安全第一、生产第二”…
Xxx乡xxx村卫生室20xx年度效验期内执业情况总结我卫生室在本校验期内严格按照《医疗机构执业许可证》所申报核准的诊疗科目开展诊…