实验四(4) SHELL实验(笔记)
实验目的:
掌握SHELL编程的基本步骤和方法,了解SHELL中常用符号,函数,程序结构和输入输出的实现方法和使用要点。
实验内容:
SHELL中的输入输出,变量,函数,结构等多种实现
操作:
a)安装WINSCP
b)连接LINUX,在右边空白处点右键,新建文件,如下图:
c)(上述代码输入或者使用cat>t1,回车,然后敲入代码内容,并按CTRL+D退出。)
d)
【root@localhost ~】#chmod +x t1
e)
【root@localhost ~】#./t1
f)下同。
(一)基础训练
简单变量
程序代码:
#!/bin/bash
#filename:myprogram
x="hello world."
echo $x
y="my first shell program."
echo $y
exit
函数
程序代码:
#func is a function name
# it echos the values of variables and arguments
func( )
{ echo "Let's begin now. "
echo $a $b $c
echo $1 $2 $3
echo "The end. "
}
a=" Working directory "
b="is"
c=`pwd`
func Welcome You Byby
echo "Today is ` date ` "
关键字let的使用
程序代码:
#!/bin/bash
x=2006
let "x = $x + 1"
echo $x
x="a string."
echo $x
测试case语句
程序代码:
number=$1
case $number in
1)echo Mon;;
2)echo Tue;;
3)echo Wed;;
4)echo Thu;;
5)echo Fri;;
6)echo Sat;;
7)echo Sun;;
*)echo "wrong";;
esac
位置变量
程序代码:
set `pwd;ls /root/shtest/canshu;date`
echo $1 $2 $3 $9 ${10} ${11}
字符串比较
程序代码:
test 'long' = 'long';echo $?
test 'long' = 'short' ;echo $?
数字比较
程序代码:
x1="005"
test "$x1" = 5
echo $?
b="005"
test "$b" -eq 5
echo $?
循环语句for
程序代码:
for i in 1 2 3 4 5 6 7
do
echo $i
done
循环语句for
程序代码:
#!/bin/bash
for day in Sun Mon Tue Wed Thu Fri Sat
do
echo $day
done
循环语句for多文件内容显示
程序代码:
#!/bin/bash
# Filename : catmore
for i ; do
cat $i
done
循环语句for列出某文件夹文件名
程序代码:
#!/bin/bash
# Filename : listbin
for i in /bin/* ; do
echo $i
done
循环语句 while
程序代码:
i=1
while test "$i" -le 9
do
s=`expr $i \* $i \* $i `
echo "$i $s"
i=`expr $i + 1`
done
循环语句 while
程序代码:
while [ $1 ]
do
if [ -f $1 ]
then echo "显示文件 : $1 "
cat $1
else echo "$1 不是正确的文件名. "
fi
shift
done
循环语句until
程序代码:
i=1
until test "$i" -gt 9
do
s=`expr $i \* $i`
echo "$i $s"
i=`expr $i + 1`
done
数值和字符操作
求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"
数值和字符操作
完成一个程序,用户输入百分制的分数,之后返回“A”“B”“C”“D”“E”的等级。其中,A等级为90至100分,B等级为80至89分,C等级为70至79分,D等级为60至69分,E等级为0至59分。
程序代码:
needquit=0
while [ $needquit -eq 0 ]
do
echo "Please input the score"
read score
case $score in
100|9[0-9]) echo "Very Good";;
8[0-9]) echo "Good";;
7[0-9]) echo "Middle";;
6[0-9]) echo "Pass";;
[1-5][0-9]) echo "Failure";;
quit|q) echo "Quit"
needquit=1;;
*) echo "Wrong Input!";;
esac
echo ""
done
数值和字符操作
运行时显示下列格式的图形:
*
* *
* * *
* * * *
* * * * *
程序代码:
文件操作
把当前目录下文件扩展名为. txt所有文件改为扩展名为. doc同名文件。
程序代码:
#!/bin/bash
FILES=`ls ./*.txt`
for txt in $FILES ; do
doc=`echo $txt | sed "s/.txt/.doc/"`
mv $txt $doc
done
文件操作
根目录下创建四个文件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
文件操作
在/ut文件夹下建立文件a0,a1,a2,a3,和建立子文件夹d0,d1,d2,d3。修改这些建立的文件和文件夹拥有者为ut,组为utgp,访问权限设置为600,然后打包并压缩这些文件和子文件夹,打包和压缩后形成的文件名称为ut.tar.gz。
程序代码:
#!/bin/bash
tempd="/ut"
mkdir "$tempd"
for((i=0;i<=3;i++))
do
touch "$tempd/a$i"
mkdir "$tempd/d$i"
done
chown -R ut1.root "$tempd"
chmod -R 600 "$tempd"
tar -cvzf "$tempd/ut.tar.gz" "$tempd"
文件操作
压缩备份:备份并压缩/etc目录的所有内容,存放在/root/bak目录里,且文件名为如下形式yymmdd_etc,yy为年,mm为月,dd为日;使用tar命令进行压缩;格式化日期作为文件名Date ‘+%y%m%d’
程序代码:
#!/bin/bash
DIRNAME=`ls /root | grep bak`
if [ -z "$DIRNAME" ] ;
then
mkdir /root/bak
fi
YY=`date +%y`
MM=`date +%m`
DD=`date +%d`
BACKETC=$YY$MM${DD}_etc.tar.gz
tar -zcvf $BACKETC /etc
echo “fileback finished!”
文件操作
在/userdata目录下建立50个目录,即user1~user50,并设置每个目录的权限,其中其他用户的权限为:读;文件所有者的权限为:读、写、执行;文件所有者所在组的权限为:读、执行:判断/userdata是否存在,如果存在直接创建子目录,不存在先创建/userdata再创建子目录 ;权限赋值rwxr-xr– 数字方式754
程序代码:
#! /bin/bash
#adddir.sh
i=1
while [ $i -le 50 ]
do
if [ -d /userdata ]
then
mkdir -p /userdata/user$i
else
mkdir /userdata
mkdir -p /userdata/user$i
fi
chmod 754 /userdata/user$i
i=$(($i+1))
done
用户和组操作
添加一个新组为class1,然后添加属于这个组的30个用户,用户名的形式为stdxx,其中xx从01到30。增加用户的主目录,及修改目录权限和组的权限
程序代码:
#!/bin/bash
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
综合应用–目录菜单编制
程序代码:
#filename:dirmenu
until
echo ListDirectory..........1
echo ChangeDirectory........2
echo EditFile...............3
echo RemoveFile.............4
echo ExitMenu...............5
read choice
test $choice = 5
do
case $choice in
1)ls
;;
2)echo Entertargetdirectory
read dir
cd $dir
;;
3)echo Enterfilename
read file
vi $file
;;
4)echo Enterfilename
read file
rm $file
;;
q|Q|5)echo Goodbye;;
*) echo illegalOption
esac
done
(二)程序填写
数值和字符操作
实现运行时显示下列格式的乘法表:
1
2 4
3 6 9
4 8 12 16
5 10 15 20 25
6 12 18 24 30 36
7 14 21 28 35 42 49
8 16 24 32 40 48 56 64
9 18 27 36 45 54 63 72 81
程序代码:
for ((i=1;i<=9;i++))
do
#填写完整代码,实现乘法表计算和格式输出
done
数值和字符操作
实现下列图形样式的数据(杨辉三角)
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
程序代码:
#!/bin/bash
((a[0,0]=1))
echo "$((a[0,0])) "
for((i=1;i<=$1;i++))
do
#填写完整代码,实现杨辉三角初始化
echo -n "$((a[i,0])) "
for((j=i-1;j>0;j--))
do
((a[i,j]=))
echo -n "$((a[i,j])) "
done
echo "$((a[i,i])) "
done
(三)代码注释
数值和字符操作
编制一个菜单,菜单项功能:
文件内容小写转换为大写;
文件内容大写转换为小写;
显示文件内容。
程序代码:
upper( ){
shift
for i
do
tr a-z A-Z <$1 >$1.out
rm $1
mv $1.out $1
shift
done; }
lower( ) {
shift
for i
do
tr A-Z a-z <$1 >$1.out
rm $1
mv $1.out $1
shift
done; }
print( ) {
shift
for i
do
cat $1
shift
done; }
usage_error( ) {
echo " $1 syntax is $1"
echo ""
echo " where option is one of the following"
echo " p--to print frame files"
echo " u--to save as uppercase"
echo " l--to save as lowercase";}
case $1 in
p | -p)print $@;;
u | -u)upper $@;;
l | -l)lower $@;;
*) usage_error $0;;
esac
数值和字符操作
实现:定义一个能多次产生四组随机数(每组7个号码,1<=号码<=36),然后让用户选择某一组作为选中的随机数,并追加到文件a.txt中存档。
程序代码:
#!/bin/bash
choice="y"
until
test $choice != "y"
do
for((i=1;i<=7;i++))
do
arr1[i]=$(($RANDOM%36+1))
arr2[i]=$(($RANDOM%36+1))
arr3[i]=$(($RANDOM%36+1))
arr4[i]=$(($RANDOM%36+1))
done
echo "FOUR GROUP RANDOM NUMBERS WILL BE CREATED:"
for((j=1;j<=4;j++))
do
echo -n "($j) "
for((i=1;i<=7;i++))
do
echo -n "$((arr${j}[i])) "
done
echo
done
read -p "INPUT YOUR CHOICE(1-4):" rndch
if [ $rndch -le 4 -a $rndch -ge 1 ]
then
for((i=1;i<=7;i++))
do
k=$((arr${rndch}[$i]))
echo -n "$k ">>a.txt
done
echo >>a.txt
read -p "YOU ALREADLY CHOICE A GROUP TO PUT A.TXT(CONTINUE PLEASE PRESS y):" choice
else
read -p "YOUR CHOICE IS INVALID(CONTINUE PLEASE PRESS y):" choice
fi
done
综合应用–问题交互式图形设计
程序代码:
#!/bin/bash
# Ask some questions and collect the answer
#filename:quesinter.sh
dialog --title "1:Questionnaire" --msgbox "Welcome to my simple survey" 9 18
dialog --title "2:Confirm" --yesno "Are you willing to take part?" 9 18
if [ $? != 0 ] ; then
dialog --infobox "Thank you anyway" 5 20
sleep 2
dialog --clear
exit 0
fi
dialog --title "Questionnaire" --inputbox "Please enter your name" 9 30 2>y.txt
Q_NAME=$(cat y.txt)
dialog --menu "$Q_NAME,?" 15 30 4 1 "Classical" 2 "Jazz" 3 "Country" 4 "Other" 2>y.txt
Q_MUSIC=$(cat y.txt)
if [ "$Q_MUSIC" == "1" ] ; then
dialog --msgbox "Good choice!" 12 25
fi
sleep 5
dialog --clear
exit 0
综合应用–系统信息测试与显示
程序代码:
#!/bin/bash
clear
echo "This is info. provided by mysystem.sh. Program starts now."
echo "Hello, $USER"
echo
echo "Today's date is `date`, this is week `date +"%V"`."
echo
echo "These users are currently connected:"
w | cut -d " " -f 1 - | grep -v USER | sort –u
# -v:显示不包含匹配文本的所有行;
#-u 去除重复行
echo
echo "This is `uname -s` running on a `uname -m` processor."
echo
echo "This is the uptime information:"
uptime
echo
echo "That's all folks!"
(四)补充shell练习
1.分析下面的shell程序,按要求完成任务:
要求1: 修改并填写好程序,使得每隔1分钟监控一次,监控./tmp下如果大于2k,发邮件给usr1,退出监控;
要求2: 先后台运行脚本,查看结果;然后拷贝stmp.txt文件到./tmp目录,再次查看结果
要求3: 打开邮件服务器客户端,查看usr1是否收到邮件;
#!/bin/bash
do
n=$(du -sb ./tmp | cut -f1)
if
then
#将文件stmp.txt的内容发送给usr1用户。
break
fi
done
附:linux shell图形界面dialog工具
一个可以和shell脚本配合使用的文本界面下的创建对话框的工具。通用选项 common options:(这个选项来设置dialog box的背景,颜色和标题等)
[–title 《title》] 指定将在对话框的上方显示的标题字符串
[–colors] 解读嵌入式“\Z”的对话框中的特殊文本序列,序列由下面的字符 0-7, b B, u, U等,恢复正常的设置使用“\Zn”。
[–no-shadow] 禁止阴影出现在每个对话框的底部
[–shadow] 应该是出现阴影效果
[–insecure] 输入部件的密码时,明文显示不安全,使用星号来代表每个字符
[–no-cancel] 设置在输入框,菜单,和复选框中,不显示“cancel”项
[–clear] 完成清屏操作。在框体显示结束后,清除框体。这个参数只能单独使用,不能和别的参数联合使用。
[–ok-label ] 覆盖使用“OK”按钮的标签,换做其他字符。
[–cancel-label ] 功能同上
[–backtitle ] 指定的backtitle字符串显示在背景顶端。
[–begin ] 指定对话框左上角在屏幕的上的做坐标
[–timeout ] 超时(返回的错误代码),如果用户在指定的时间内没有给出相应动作,就按超时处理
[–defaultno] 使的是默认值 yes/no,使用no
[–sleep ]
[–stderr] 以标准错误方式输出
[–stdout] 以标准方式输出
[–default-item ] 设置在一份清单,表格或菜单中的默认项目。通常在框中的第一项是默认窗体类型:常见的对话框控件选项有:
[ –calendar ] 提供了一个日历,让你可以选择日期
[ –checklist ] 允许你显示一个选项列表,每个选项都可以被单独的选择 (复选框)
[ –from ] 允许您建立一个带标签的文本字段,并要求填写
[ –fselect ] 提供一个路径,让你选择浏览的文件
[ –gauge ] 显示一个表,呈现出完成的百分比,就是显示出进度。
[ –infobox ] 显示消息后,(没有等待响应)对话框立刻返回,但不清除屏幕 (信息框)
[ –inputbox ] 让用户输入文本 (输入框)
[ –inputmenu ] 提供一个可供用户编辑的菜单 (可编辑的菜单框)
[ –menu ] 显示一个列表供用户选择 (菜单框)
[ –msgbox ] 显示一条消息,并要求用户选择一个确定按钮 (消息框)
[ –pause ] 显示一个表格用来显示一个指定的暂停期的状态
[ –passwordbox ] 显示一个输入框,它隐藏文本
[ –passwordfrom ] 显示一个来源于标签并且隐藏的文本字段
[ –radiolist ] 提供一个菜单项目组,只有一个项目,可以选择 (单选框)
[ –tailbox ] 在一个滚动窗口文件中使用tail命令来显示文本
[ –tailboxbg] 跟tailbox类似,但是在background模式下操作
[ –textbox ] 在带有滚动条的文本框中显示文件的内容 (文本框)
[ –timebox ] 提供一个窗口,选择小时,分钟,秒
[ –yesno ] 提供一个带有yes和no按钮的简单信息框 (是/否框)
命令示例:
1.消息框格式:dialog – -msgbox text height width
例子:
# dialog --title TESTING --msgbox "this is a test" 10 20
2.yesno框格式:
dialog –yesno text height width
例子:
# dialog --title "yes/no" --no-shadow --yesno "Delete the file /tmp/chensiyao.txt?" 10 30
3.输入框格式:
dialog --inputbox text height width
例子:
# dialog --title "Input your name" --inputbox "Please input your name:" 10 30 2> /tmp/name.txt
(这里的2>是将错误信息输出重定向到了/tmp/name.txt文件中)
4.密码框格式:
dialog --passwordbox text height width [init]
例子:
# dialog --title "Password" --passwordbox "Please give a password for the new user:" 10 35
这样密码暴露出来不是很安全,所以通常会加上一个安全选项–insecure 将每个字符用*来显示出来
# dialog --title "Password" --insecure --passwordbox "Please give a password for the new user:" 10 30
5.文本框格式:
dialog --textbox file height width
例子:
# dialog --title "The fstab" --textbox /etc/fstab 17 40
6.菜单框格式:
dialog --menu text height width menu-height tag1 item1 tag2 item2 …
例子:
# dialog --title "Pick a choice" --menu "Choose one" 12 35 5 1 "say hello to everyone" 2 "thanks for your support" 3 "exit"
7.Fselect框(文件选框)格式:
dialog --fselect filepath height width
例子:
# dialog --title "Pick one file" --fselect /root/ 7 40
8.复选框
格式:
dialog --checklist "Test" height width menu-height tag1 item1 tag2 item2 …
例子:
# dialog --backtitle "Checklist" --checklist "Test" 20 50 10 Memory Memory_Size 1 Dsik Disk_Size 2
9.显示日历
格式:
dialog --calendar "Date" height width day month year
例子:
#显示当前日期
# dialog --title "Calendar" --calendar "Date" 5 50
#显示指定日期
# dialog --title "Calendar" --calendar "Date" 5 50 1 2 2013
10.进度框架格式:
dialog --gauge text height width [<percent>]
例子:
#固定进度显示
# dialog --title "installation pro" --gauge "installation" 10 30 10
#实时动度进度
# for i in {1..100} ;do echo $i;done | dialog --title "installation pro" --gauge "installation" 10 30
#编辑到脚本中
编辑一个gauge.sh
的脚本内容如下:
#!/bin/bash
declare -i PERCENT=0
(
for I in /etc/*;do
if [ $PERCENT -le 100 ];then
cp -r $I /tmp/test 2> /dev/null
echo "XXX"
echo "Copy the file $I ..."
echo "XXX"
echo $PERCENT
fi
let PERCENT+=1
sleep 0.1
done
) | dialog --title "coping" --gauge "starting to copy files..." 6 50 0
11.from框架(表单)格式:
dialog --form text height width formheight [ label y x item y x flen ilen ] ...
其中flen 表示field length,定义了:选定字段中显示的长度ilen 表示 input-length, 定义了:在外地输入的数据允许的长度使用up/down(或ctrl/ N,ctrl/ P)在使用领域之间移动。使用tab键在窗口之间切换。
例子:
# dialog --title "Add a user" --form "Please input the infomation of new user:" 12 40 4 \
"Username:" 1 1 "" 1 15 15 0 \
"Full name:" 2 1 "" 2 15 15 0 \
"Home Dir:" 3 1 "" 3 15 15 0 \
"Shell:" 4 1 "" 4 15 15 0
综合应用示例:
#!/bin/bash
yesno() {
dialog --title "First screen" --backtitle "Test Program" --clear --yesno \
"Start this test program or not ? \nThis decesion have to make by you. " 16 51
# yes is 0, no is 1 , esc is 255
result=$?
if [ $result -eq 1 ] ; then
exit 1;
elif [ $result -eq 255 ]; then
exit 255;
fi
username
}
username() {
cat /dev/null >/tmp/test.username
dialog --title "Second screen" --backtitle "Test Program" --clear --inputbox \
"Please input your username (default: hello) " 16 51 "hello" 2>/tmp/test.username
result=$?
if [ $result -eq 1 ] ; then
yesno
elif [ $result -eq 255 ]; then
exit 255;
fi
password
}
password() {
cat /dev/null >/tmp/test.password
dialog --insecure --title "Third screen" --backtitle "Test Program" --clear --passwordbox \
"Please input your password (default: 123456) " 16 51 "123456" 2>/tmp/test.password
result=$?
if [ $result -eq 1 ] ; then
username
elif [ $result -eq 255 ]; then
exit 255;
fi
occupation
}
occupation() {
cat /dev/null >/tmp/test.occupation
dialog --title "Forth screen" --backtitle "Test Program" --clear --menu \
"Please choose your occupation: (default: IT)" 16 51 3 \
IT "The worst occupation" \
CEO "The best occupation" \
Teacher "Not the best or worst" 2>/tmp/test.occupation
result=$?
if [ $result -eq 1 ] ; then
password
elif [ $result -eq 255 ]; then
exit 255;
fi
finish
}
finish() {
dialog --title "Fifth screen" --backtitle "Test Program" --clear --msgbox \
"Congratulations! The test program has finished!\n Username: $(cat /tmp/test.username)\n Password: $(cat /tmp/test.password)\n Occupation: $(cat /tmp/test.occupation)" 16 51
result=$?
if [ $result -eq 1 ] ; then
occupation
elif [ $result -eq 255 ]; then
exit 255;
fi
}