Linux实验三:Shell编程


一、实验目的

1.为文件扩展名使用通配符

2.标准输入、标准输出和标准错误的重定向

3.使用管道将一个进程的输出作为输入提供给另一个进程。

4.执行命令分组和行继续

5.编写shell 脚本。


二、实验要求

1、管道(pipe-line)的使用
执行格式: command1|command2
功能:将command1的执行结果送到command2 作为输入

2、标准输入控制
执行格式: command-line<file 将file作为command-line的输入

3、标准输出控制
执行格式一: command>filename
功能:将command的执行结果送至指定的filename中
执行格式二: command>!filename
功能:同上,若filename文件已存在,则强迫重写
执行格式三:command>>filename
功能:将command 的执行结果,附加(append)到filename

4、shell脚本的调试方法:
(1)输入重定向到shell脚本
格式:$ bash < 脚本名
(2)以脚本名作为bash参数
格式:$ bash 脚本名 [参数]
(3)在提示符下直接执行
方法:先利用chmod命令将脚本文件设置为可执行权限;然后,将该脚本所在的目录添加到命令搜索路径中
(4)将shell脚本的权限设置为可执行,然后在提示符下直接执行
方法:
先利用chmod命令将脚本文件设置为可执行权限


三、实验内容

1、通配符的使用

(1)进入/etc目录并且将此处所有文件以列表显示

$ cd /etc
$ ls(或者$ echo *)
在这里插入图片描述

(2)要求用带有通配符的ls命令来显示文件名,实现:
-以conf结束

ls *conf
在这里插入图片描述

-以d 或D开始

ls [dD]*
在这里插入图片描述

-在文件名的第五个位置包括一个o

ls -d ????o*在这里插入图片描述

-包含单词tab

ls -d *tab*在这里插入图片描述

-以数字结尾

ls -d *[0~9]
在这里插入图片描述

-不以数字结尾

ls -d *[!0~9]
在这里插入图片描述

(3)如果你执行命令ls -d ?[!y]*[e-f]将会发生什么情况?能与之匹配的最短文件名是什么?执行这些命令来验证你的答案。

第一个位置匹配任意一个字符,第二个位置字符不是y,第二个位置之后到最后一个位置之间任意字符串,最后一个位置字符是e或者f。
在这里插入图片描述


2、重定向

(1)使用cat命令和指令来创建一个包含几行文本名为junk的文件。

在这里插入图片描述

(2)使用重定向junk文件中追加几行文本。然后查看junk文件的内容并且检查你刚刚所创建的文本是否都存在。

在这里插入图片描述


3、管道

(1)统计你当前目录所有文件的数目。使用管道,而不是手动地统计所有文件

在这里插入图片描述

(2)ls > tempfile ; wc -l tempfile是否和你刚刚使用的管道功能相同?为什么或者为什么不?

不同,管道功能不需要新的文件,本题的操作创造了新的文件tempfile。

(3)将多个用户文件联合为一个大文件。

在这里插入图片描述


4、shell变量

(1)显示由你当前进程环境所定义的所有变量。并且显示出当前输出的所有变量。

$ set

(2)创建一个变量x并初始化值为10。检查这个变量的值。再次,显示当前进程环境的所有变量。

在这里插入图片描述

(3)创建一个subshell.查看变量x在subshell下的值是什么?

在这里插入图片描述

(4)将x设置为500并返回到父进程。当前x的值是什么?为什么?

x=10的值保存在父进程中,x=500的值保存在了子进程中,互不继承。
在这里插入图片描述

(5)确保子进程继承了x。如何实现?

在这里插入图片描述


5、建立下面的脚本,运行并分析输出结果,并给出代码注释。

(1)ex1

#!/bin/bash   //所使用shell的绝对路径名,表示由bash脚本编写,从而应调用相应的解释程序予以执行
#shell special character   //“#”开头正文行表注释
echo "current directory is `pwd`"  //显示current directory is 当前目录的绝对路径
echo "current directory is 'pwd'"  //显示current directory is 'pwd'
echo "home directory is $HOME"   //显示home directory is 当前用户
echo "file*.?"  //显示file*.?
today=`date`  //将命令date赋给变量today
echo Today is :$today  //显示Today is :此刻的日期
ls ex*  //显示当前目录中文件名是以ex打头的文件

在这里插入图片描述

(2)ex2

#!/bin/bash
#bash script programming
if test $# == 0 //参数个数为0
then
        ls -l|grep '^d'   //显示当前目录中的所有文件夹信息
else
        for i
        do
                ls -l $i|grep '^d'  //显示各个参数目录中的所有文件夹信息
        done
fi

在这里插入图片描述

(3)ex3

case $1 in  //选择 -b或者-s如果什么都不选就进入*)
-b) count=`grep ^b $2 | wc -l`
echo "The number of lines in $2 that start with b is $count.";;
//显示The number of lines in 给出的文件 that start with b is 第几行
-s) count=`grep ^s $2 | wc -l`
echo "The number of lines in $2 that start with s is $count.";;
//显示The number of lines in 给出的文件 that start with s is 第几行
*) echo "That option is not recognized.";;
//显示That option is not recognized.
esac //关闭case

在这里插入图片描述


6、编写脚本

(1)编写shell 脚本,计算1-100 的和;
在这里插入图片描述

(2)编写shell 脚本,要求输入一个数字,然后计算出从1 到输入数字的和,要求,如果输入的数字小于1,则重新输入,直到输入正确的数字为止;
在这里插入图片描述

(3)编写shell 脚本,把/home目录下的所有目录拷贝到/tmp目录下;
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Jormungand_V/article/details/109381248