• 系统编程第三次上机


    先把题目和百度到的参考资料粘过来吧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位~末尾的字串。

     同第二题

  • 相关阅读:
    想不赚钱都难的7大行业
    [转帖]一位年轻商人的经验感悟
    对待下级十二条准则
    让自己幸福的10条秘诀
    孤独感
    “3+3”看华为云FusionInsight如何引领“数据新基建”持续发展
    【乘风破浪的开发者】丁一超:从AI实战营出发探索未知的AI世界
    适用初学者的5种Python数据输入技术
    遥感影像处理有高招,“专治”各类花式并发的述求!
    从“小众”到“首选”,推动云原生产业落地华为云作用几何?
  • 原文地址:https://www.cnblogs.com/PineZhuo/p/10539272.html
Copyright © 2020-2023  润新知