实验9:shell及shell编程
1、实验目的
1)sed的使用;
2)awk的应用;
3)shell及shell编程;
4) 与用户启动相关的文件及使用。
2、实现设备
一台装有Windows操作系统和Linux机系统的微机或服务器。
3、实验方法与注意事项
1)由于是以root用户工作的,权力很大,请不要在系统内做对系统或对其他用户不安全的事情。
2)要求每个同学登录后系统后,要在自己的家目录内容以自己(汉语拼音)名字,使用mkdir命令创建一个子目录。以后所有工作都要在自己的目录内进行。
3)认真编写实验报告
4、实验过程
1) sed命令的使用:
(1) 将ifile文件中的所有sysman替换成System Manager并输出到ofile sed -e 's/sysman/System Manager/g' <ifile >ofile
(2) 显示ifile文件中的所有注释行
#sed -e '/^#/!d' < ifile #参见不执行某命令!function
(3) 删除文件ifile中的空行,并将其它的内容输出到ofile:
方法①
#sed '
/^$/d
/^[<tab><Space>]*$/d
' <ifile >ofile
#注:tab为tab键,<tab>可用\t表示,<space>为空格键。
②也可写为:
sed '/^$/d;/^[<tab><Space>]*$/d' <ifile >ofile 或写为
sed '/^$/d;/^[[:blank:]]*$/d' <ifile >ofile 或写为
sed '/^$/d;/^[[:space:]]*$/d' <ifile >ofile
③如果脚本命令较多,也可将整个脚本内容写入文件(比如e_script)中,此时命令的执行可如下进行:
sed –f e_script < ifile > ofile
2) awk命令的使用
(1) 显示系统内root的进程,它们是什么,进程号是多少
ps -ef | awk '/root/{ print $1, $2, $8 }'
(2) 显示系统所非root用户在干什么,他们是谁?
ps -ef | awk '!/root/{ print $1, $8 }'
(3) 使用awk计算文件infile内数字的和。
awk '{ sum += $1 }; END { print sum }' ifile
注:假设infile内容为数字串,且每个数字串占一行。
(4) 显示系统内已经注册(创建)的所有用户(显示/etc/passwd内的所有用户) awk -F: '{ print $1 }' /etc/passwd #-F:指定域分隔符为“:”
3)shell编程
(1) 设计一个程序,带一个(目录)参数。实现功能:(1)首先判断是否带有参数,若无则显示用法信息后,报错返回;(2)带首先判断该参数是不是目录。若是则列目录的内容,否则,提示用户不是目录,则显示警告信息后报错返回。
#!/bin/sh
if [ $# -ne 1 ] #check if have 1 parameter
then
echo "Usage: $0 dir" #Diaplay Usage
exit 1 #return 1
fi
if [ -d "$1" ] #if is a dir;then
ls $1/*; exit 0 #list the dir,and return 0
fi
echo "Warn: $1 is not a directory" #Warning message
exit 2 #return 2
注:输入时可不输入注释部分。设此程序名为myls,为其增加执行权后,运行方法为: ./myls #返回码为1
./myls dir #如果dir是个目录,则列其内容
./myls file #若file是文件或不存在则给出警告后返回2
(2) 用嵌套式if-fi语句实现(1):
#!/bin/sh
if [ $# -ne 1 ] #check if have 1 parameter
then
echo "Usage: $0 dir" #Diaplay Usage
exit 1 #return 1
elif [ -d "$1" ] #if is a dir
then
ls $1/*; exit 0 #list the dir,and return 0
else
echo "Warn: $1 is not a directory" #Warning message
exit 2 #return 2
fi
(3) 设计一个程序,从命令行接收数值参数,并计算这些参数的和。
x=0
for y in $*
do
x=`expr $x + $y`
done
echo "The Sum is: $x"
注:设程序名为myadd,增加执行权后,运行方法为:myadd 20 35 100 60 但是,本程序是有问题的,原因是它没有判断输入数据的合法性。下面是一个增加输入数据合法性检查的程序。
x=0
for y in $*
do
z=`echo $y | awk '/^[[:digit:]]*$/ { print $0 }'`
if [ -z $z ]; then
echo -e "Invalid command line parameter: $y\a"; exit 1 fi
x=`expr $x + $y`
done
echo "The Sum is: $x"
(4) 设计一个程序,计算前n个正整数的和:
x=0; y=1
while true
do
x=`expr $x + $y`
y=`expr $y + 1`
if [ $y -gt $1 ]; then break; fi
done
echo "1+2+..+$1=$x"
注:此程序要带有1个参数作为整数n,以计算前n个正整数的和。设程序名为myadd1,则运行方法是:myadd1 10或myadd1 100等。
(5)here文档
#!/bin/sh
cmd="uname -s"; name=`whoami`
cat << !
My name is $name, I am a student.
I study computer, and now I have an exam of `$cmd` OS.
!
4) 与用户登录相关文件
.bash_history #历史文件
.bash_logout #用户注销时要执行的文件
.bash_profile #用户登录时要执行的文件
.bashrc #用户登录时要执行的文件,由.bash_profile调用 /etc/bashrc #用户登录时要执行的文件,由.bashrc调用
/etc/profile #用户登录时要执行的文件,由/etc/bashrc调用 /etc/profile.d/* #用户登录时要执行的文件,由/etc/profile调用 用户可以根据需要修改,它们的内容。
以下为一个菜单程序(可取名为sh_add),可将它加在用户.bash_profile的最后,当用户登录时,若成功则直接执行此程序而进入菜单控制,当用户退出菜单时直接注销自己,回到login登录界面。
trap '' 1 2 3 15 #trap the signal 1,2,3,15
func1( ){
echo -e "\n\n\t\t\tThist is Function 2 Demontration!"
echo -e "\t\t\t11xxxxxxxxxxxx11xxxxxxxxxxxx1!"
}
func2( ){
echo -e "\n\n\t\t\tThist is Function 2 Demontration!"
echo -e "\t\t\t2222222222222222222222222222222!"
}
while true
do
clear
echo -en "
\t+-----------------------------------------------------+\n\ \t| |\n\ \t| 1.func1 2.func2 q.quit |\n\ \t| |\n\ \t+-----------------------------------------------------+\n\ \t\t\tPlease get Select 1,2 or q:"
read x
case $x in
1)
func1;;
2)
func2;;
s|S)
trap 1 2 3 15
break;;
Q|q)
exit 0;;
*)
echo -e "\a";;
esac
echo -en "\n\t\t\tPress Enter Key to Contiune:"
read x; clear
done
注意:应$HOME/.bash_profile的最后加入一行:
. sh_add
让该程序在当前shell内运行。
当此文件放在$HOME/.bash_profile内后,X-Windows将无法正常启动。注释掉此命令所在行后可恢复X-Windows正常启动。也可以通过在以上代码中的while true加入根据终端号进行判断办法来实现:具体做是当用户在/dev/tty1~/dev/tty12是使用本程序时执行while true语句段,否则跳过while true;do … done语句段,什么都不做。(由用户自己完成)
当然,用户也可以修改$HMOE/.bash_profile干别的事情,比如设置环境变量等。此方法在用户登录控制设置时是非常有用的。
请实验者关注程序中两个trap语句的作用。S|s的功能是什么?
4、实验报告的内容与书写
以书面形式记录下你的每一步过程,包括输入、输出信息,遇到的问题和解决的办法。
实验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.根据实验步骤,写出实验报告
南京信息工程大学实验实习报告实验目的1了解和熟悉创建并使用脚本的步骤2熟悉bash的控制结构3学会简单的shell编程实验内容1创…
LINUX实验报告专业班级学号姓名报告时间1实验一Shell编程一实验名称考勤模拟shell程序设计二实验目的理解Shell程序的…
实验报告学生打印后提交实验名称shell编程实验时间10年04月21日实验人员姓名学号年级实验目的1熟悉使用Linux下的软件开发…
南京信息工程大学实验实习报告实验目的1了解和熟悉创建并使用脚本的步骤2熟悉bash的控制结构3学会简单的shell编程实验内容1创…