系统编程第三次上机

先把题目和百度到的参考资料粘过来吧orz

弱智答案等ddl过了再粘上来

一是怕错误的答案误导大家,二是怕查重QAQ

实验目的

掌握shell中管道、重定向的用法 学习shell基本语法

进阶内容

注:本部分内容不作为实验必须要求,只是作为对有兴趣深入学习的同学的一些指导。

正则表达式

akw的深入学习http://www.zsythink.net/archives/tag/awk/

sed与grep

实验环境

bash!!!!

实验指导

1. 查看当前shell种类

在shell中输入 echo $shell, 输出应当是bash。

 

如果不是,可以使用which sh ,该命令将显示sh命令的完整路径, 然后将通过创建软链接使得sh指向bash。(强 行复习软链接)

2. 重定向

Linux中默认输入输出分为3类:

标准输入stdin。标准输入文件的编号是0(牢记linux万物皆文件),默认的设备是键盘,命令执行时从键盘读 取数据。

标准输出stdout。标号为1,默认的设备是显示器,命令的输出会被打印到屏幕上。

标准错误stderr。标号为2,默认的设备是显示器,命令执行产生的错误信息会被发送到标准错误文 件。

重定向的意思就是改变这三个文件实际指向,比如我们希望从某个文件中获取输入,那么就需要将标准输入指向这 个文件。 重定向后命令依然从标准输入获得输入,此时标准输入指向这个文件,故命令能够从这个文件获取输 入。

输入重定向:

命令 < 文件名 , 比如 sort < sp.txt , 把sp.txt文件中的内容作为sort的输入。

输出重定向:

命令 > 文件名 , 比如 cat /etc/passswd > ps.log , cat会输出/etc/passwd中内容,但此时并不会输出到屏 幕上,而是输出到ps.log中。

>  会覆盖原文件中内容,  >> 则会将输出追加到原文件末尾。

错误重定向:

命令 2> 文件名 ,比如 gcc -c test.c -o test.out 2 > error.log, 如果gcc编译时出现错误,则会把错误信息输 出到error.log中。

>  会覆盖原文件中内容,  >> 则会将输出追加到原文件末尾。

其他

在重定向错误时使用了错误文件的编号2    其实在输入输出的时候也可以显式写0或1,通常是省略。

&运算符,表示等同于, 2>&1,表示将标准错误从重定向到标准输出指向的文件。如 1>/dev/null ,然 后执行2>&1,此时都指向空设备。

3.  管道

管道作用是将多个命令串连起来,使一个命令的输出作为另一个命令的输入。 命令1 | 命令2 | 命令3 ....| 命令n

ls /etc | grep init 将会输出/etc目录下,文件名包含init的文件/目录。 如果不使用管道,命令就得拆成: ls

/etc > tmp grep init < tmp rm tmp ls /etc | grep init >> testcat test

4. 命令连接符

 

命令的执行是串行的,一条命令结束才能输入下一条命令,我们可以在命令之间加上;分割命令,从而可以一 行输入所有命令。shell会挨个执行。

&&连接符

 

命令1 && 命令2 && 命令3 ,shell在判断出这个表达式的真假后就会停止执行。如果命令1为false,可以判断表达式 一定为假,执行停止。如果为true,那么还需要执行命令2,一直执行到能判断真假为止或者执行完被&&连接的命    令。

 

||连接符

 &&  ,  执行到能判断真假或者所有被连接命令被执行完为止。&&和||的计算方式同c语言中的&&  ||。

4. shell-变量

 

在shell中使用变量无需定义,在使用的时候创建。并且变量不分类型,shell统一认为是字符串,需要的时候 通过一些命令进行转换。

变量赋值 : 变量名= ,等号左右不能够有空格。若字符串中包含空格,则需要用单/双引号括起来。 可以使用readonly将变量改为只读类型。

通过 $ 引用变量值, echo $shell 。 输入变量, read 变量名 

 

引用格式返回值

$var 返回变量值

$var 返回变量值

${#var} 返回变量值的长度

${var:start} 返回从start下标到字符串末尾的子串

${var:start:length} 返回从start下标开始,长度为length的子串

 

实际上还有一些空值判断、字符串替换和正则匹配拆分字符串等,为了精简篇幅,这里不再列举,可自行查阅资料。

 

环境变量

export  变量名  将一个已经存在的本地变量修改为环境变量。 export  变量名=,定义一个环境变量。

 

位置变量

 

在执行shell脚本的时候,可以传入参数,如当前有个脚本叫test, 执行sh test arg1 arg2 arg3 ,那么在test中,$0 代表脚本文件名,$1为第一个参数:arg1,以此类推。   使用shift可以将参数左移,此时$1为arg2,$2为arg3,  $3为   $#为参数数量。

 

特殊参数含义

$# 传递到脚本的参数数量

$? 前一个命令执行情况,0成功,其他值失败

$$ 运行当前脚本的进程id

$! 运行脚本最后一个命令

$* 传递给脚本或者函数的所有参数

 

5. shell-变量运算

let

let 表达式 , 会计算此表达式, 如let i=i+1

(())

((i+=3))

expr

echo `expr 3 + 5` , 这里的引号是反引号,tab上面那个键。

6. shell-if

if 条件

then

....

fi

==============================

if 条件; then #这里有分号,同一行需要分号,可以参考前面命令连接符。或者把then放到下一行

...

else

...

fi 

==============================

if 条件; then...

elif 条件; then...

else...

fi

条件格式为:

1.  一条完整的命令,或者用|| &&等连接的命令。

2. 字符串比较,[逻辑表达式],[ $shell != "bash" ] 。如果后面字符串不含空格,这里可以不加引号,不等号 是!=。

3.   需要注意的是,  []以及其他部分之前需要用空格分离,注意上面的例子,每个部分都用空格分割。

 

4. 数值比较为 [ $a -lg 6 ], -lt为less than, -le为less equal, -eq为equal , -ne为not equal,-ge为greater than, - gt同理。

5. 常用文件测试为: if [ -d arg ] ,如果arg是目录则为真。-f为文件为真,-r可读为真,-w可写,-x可执行等。

 

6. shell-select

交互式命令,用户在预定的选项中选择一个。

select 变量  in 列表

do

...

break done

例子见附件

7. shell-case

类似c中switch

case $var in

'选项1') ... ;;

"选项2") ... ;;

选项3 ) ,,,

esac

 

匹配选项可以用引号,以可以直接列出。然后加上一个   )。

 

7. shell-for

 

for 变量  in 变量列表

do

...

done

 

例子见附件

 

8. shell-while

 

while [表达式] do

...

done

 

例子见附件

 

8. shell-until

 

until [表达式] do

...

done

 

例子见附件

9. shell-函数

 

[function] 函数名 [()]

{

...

[return int]

}

[]中内容可以省略。根据测试只能省略一个。如果不设置返回值,则返回最后指令的执行结果。

 

调用方式为 函数名 参数1 参数2

函数中变量也是全局变量,如果要定义局部变量,则在变量赋值前加上local关键字,如 local a=5。 在函数中,引用参数是通过$1、$2等完成,$0代表函数名。

实验内容

1. 完成一键配置源的脚本,功能有,备份原有源,然后添加163或者清华源等,然后使用yum的update选项更 新。可以在脚本中加入自己常用的软件快捷安装命令,比如vs  code或者chrome的等等。

先进入yum源配置目录
cd /etc/yum.repos.d
备份系统自带的yum源
mv CentOS-Base.repo CentOS-Base.repo.save
下载yum源
163的yum源:
wget http://mirrors.163.com/.help/CentOS6-Base-163.repo
(会在/etc/yum.repos.d下生成相应的文件)

更新完yum源后,更新一下,使操作立即生效
yum makecache

用新的yum更新系统(速度快很多)

yum -y update

2.  计算斐波那契数列,第17个值,禁止打表输出。

shell编程建议看《Linux编程基础》

或者博主南柯梦的5篇系列博客:https://www.cnblogs.com/dongying/p/6262935.html

3.  完成一个简单的交互设计,根据用户输入输出对应内容,具体交互内容随意,要求至少用上select,case和read。

同第二题

4. ls -l /boot/grub2 && cat /boot/grub2/grub.cfg | more,解释此条命令含义。

如果自己的虚拟机中没有这两个目录,不要紧。反正是解释又不是要运行23333

&&的使用格式:command1 && command2,command1成功执行后(返回0),继续执行command2

如果command1执行失败(例如不存在这个目录或没有权限,返回非0) ,此时command2不会执行

(其实这个道理很简单2333不是跟c语言一样嘛,唯一的区别是c语言是判断command的true、false,而shell编程是判断是否成功执行)

同理,command1 && command2 && command3.....&& commandn 只要有一个执行失败,后面的命令就不会被执行了

| 是管道,管道前的输出作为管道后的输入,在这里就是前两个命令的输出用more命令输出

5. 在脚本中通过管道+一些命令使得脚本自动提权,而不是输入密码提权,可能用到的命令echo、sudo、su。

用echo输出密码,再通过管道把密码输入,从而实现不必要手动输入密码提权

6. 设计一个函数,输入一个字符串,要求输出字符串第3位~末尾的字串。

 同第二题

posted @ 2019-03-15 20:15  不吃香菜的豆芽君  阅读(560)  评论(1编辑  收藏  举报