实验四(4) SHELL实验(笔记)

  • Post author:
  • Post category:其他




实验四(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
}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述



版权声明:本文为qq_43736514原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。