• 令人心力俱疲的00周


    预备作业一:

    1、你对专业的认识和期望是什么?

    • 徐老师说过,C语言是很多语言的基础,学好C语言,将来接触的不论是面向对象还是面向过程的语言都能沉下心,能轻松解决面临的问题,处理棘手的麻烦,我不知道事实是否真是如此,心里满怀期待。我也上网搜索了一些Java相关的介绍,Java是一种面向对象的语言,用Java编写的网站以性能为王的优势以不变应万变,功能强大,大型,分布式,高并发系统都由Java编写,目前处于世界第一编程语言。

    • 作为电科院的学生,作为网空系的学生,作为一名即将大二的学生,我希望自己能在C语言的基础上,学习更多编程的知识,不断提高自己,使自己富有竞争力。

    2、上学期C语言总代码量大概多少行,本学期实践10000行代码,你觉得这个负担大吗?

    • 通过作业系统和自己平常练习,大致有6、7k左右。
    • 凡事都有挑战,上个学期C语言总共48个课时,这学期听说96个课时,两倍的课时完成上学期两倍的代码量是在意料之中的,所以负担不大。

    3、你的C语言学习怎么样?如果学的还行,你认为从C语言学习中比较好的经验是什么?如果学的不好,那么你学的不好的原因是什么?(每个人需要根据实际情况,分析学习经验或者学习不好的原因)

    • C语言学的算是中等,懂得一些编程的情况,但也学的不精,文件处理那部分基本不懂,链表也不懂。
    • 首先是自己上机上的太少,心血来潮才打几道题,没有一些规律;其次是课时真的很少,老师上课就像上午栽树,下午取材,太心急了,有时候课下搞很长时间还没搞懂第二天就又开始新的内容了,让人无奈,硬着头皮往下学,考前两周才基本全部弄清楚,因为当时没课,能搞它。

    linux学习过程:

    一、 入门了解

    熟悉很多快捷键,例如Tap键,Ctrl+某键,Ctrl+alt+某键,会在操作时带来很多方便。并且学习使用通配符,主要有*和?,用来对字符串进行模糊匹配,当查找文件时,可以代替多个字符。并学习建立文件和查找文件。

    练习过程

    首先回到用户目录,

    $ cd /home/shiyanlou
    

    再使用touch命令建立文件,后缀为.txt:

    $ touch asd.txt fgh.txt
    

    假设我是很久之前建立的这两个文件,现在想找出但忘记文件名,便可使用通配符“

    $ ls *.txt
    

    如果想建立多个文件,比如:
    jxzs_1.txt, jxzs_2.txt, ...jxzs_10.txt:

    $ touch jxzs_{1..10}_.txt
    

    二、用户文件及权限

    如果想知道本用户名是什么,直接输入who am i 即可:

    $ who am i
    

    创建用户

    在Linux里,root账户拥有最高的权利,能执行增、删、改、查所有操作。我们一般登录都是以普通账户的身份登录的,想要获得root权限,就需要sudo命令(superuser do)。

    建立一个叫cistine的用户:

    $ sudo adduser cistine
    

    之后会有一系列选项,直接回车默认。
    linux下输入密码是不显示任何内容的可以通过sudo passwd shiyanlou命令进行更改设置

    $ sudo passwd cistine
    

    此新建用户命令不但可以添加用户到系统,也会默认为新用户创立home目录:

    $ ls /home
    

    完成以上操作,我已经创立好一个名叫cistine的用户,现在可以使用此用户登录,用以下命令:

    $ su -l cistine
    

    如果想退出当前用户,同样可以使用exit或者快捷键ctrl+d

    用户组

    我理解的用户组:不同的用户拥有一些共同的权利和资源,同时拥有私有的资源。

    要想知道自己属于哪些用户组,用以下方法:

    一、使用groups命令
    $ groups cistine
    
    二、查看/etc/group文件
    cat /etc/group | sort
    

    cat命令用于读取指定文件的内容并打印到终端输出,| sort表示将读取的文本进行一个字典排序在输出。

    将其他用户加入sudo用户组

    默认情况下,新创建的用户是不具有root权限的,也不在sudo用户组,可以让其加入sudo用户组从而获取root权限。
    用cistine执行sudo命令将asd添加到sudo用户组,使asd也可以使用sudo命令获得root权限。

    $ su cistine
    $ groups asd
    $ sudo usermod -G sudo asd
    $ groups asd
    

    再切回asd用户,asd也可以使用sudo获取root权限了。

    删除用户
    $ sudo deluser asd --remove-home
    

    三、查看文件权限

    查看文件权限还是用ls命令,这一部分我目前确实不是很理解,看了实验楼的教程,还是蒙圈的状态,希望后面能听老师解释解释。
    目前我所知道的是linux里面一切皆文件。

    变更文件所有者

    假如现在是cistine 登录,新建一个文件,命名为uiop:

    $ su cistine 
    $ cd /home/cistine
    $ touch uiop
    

    可以看见文件拥有者是cistine,那么现在exit注销,换成普通用户,使用命令变更所有者。

    $ cd /home/cistine
    $ ls uiop
    $ sudo chown shiyanlou uiop
    

    现在发现所有着已经修改为普通用户shiyanlou.

    修改文件权限

    有时自己的文件不想被他人读取,可以通过两个方式:

    1、二进制数字表示
    $ echo "echo "hello shiyanlou""> iphone6
    

    然后修改权限:

    $ chmod 600 iphone6
    

    现在其他用户就读不了了。

    2、加减赋值操作
    $ chmod go-rw iphone6
    

    在我理解来看,adduser和useradd区别在于:adduser是多个命令的集合,而useradd是单个创建用户命令,执行完立刻返回。


    四、linux目录结构及文件基本操作

    路径

    路径分为绝对路径和相对路径

    绝对路径是以“/”目录为起点的完整路径,以你所想要的目录为终点。

    相对路径是以当前目录.为起点,以你所想要的目录为终点。如果是当前目录的上一级目录,则需要使用..,

    linux文件的基本操作

    新建、复制、删除、移动文件与文件重命名、查看文件、查看文件类型、以及编辑文件。

    这时候我渐渐有一点点感觉了,发现linux很注重目录,目录是一个框架,自我感觉要想学好linux,目录是基础中的基础,必须要培养良好的习惯,我搜索了下cd是啥意思,确实学习了很长时间但还是有很多不明白的地方,边学边记吧。


    cd的意思是回到用户家目录,(得看你是用什么用户登录,如果以root身份登录,执行此命令后,回到/root/目录下如果是以其他用户登录的话,则是回到/home/目录下)


    1、新建

    -p作为参数,可以同时创建父目录,同时创建一个多级目录:

    $ mkdir -p father/son/grandson
    $ cd father/son/grandson
    $ pwd
    
    2、复制
    • 复制文件

    使用cp(copy)命令进行复制

    • 复制目录
      不能直接用cp命令,会出现错误,要成功复制目录需要加上-r或者-R参数,表示递归复制。
    $ cd /home/shiyanlou
    $ mkdir family
    $ cp -r father family
    
    3、删除
    • 删除文件

    使用rm命令删除一个文件:

    $ rm test
    

    有时会遇到想要删除一些为只读权限的文件,可以用-f参数强制删除:

    $ rm -f test
    
    • 删除目录

    和复制目录一样,要删除一个目录,同样要加上-r或-R参数“

    $ rm -r family
    
    4、移动文件与文件重命名
    • 移动文件

    使用mv命令移动文件(剪切)。
    例:将“file1”移动到Documents目录:

    $ mkdir Documents
    $ touch file1
    $ mv file1 Documents 
    
    • 重命名文件

    例:将文件“file1”重命名为“myfile”

    $ mv file1 myfile
    
    • 批量重命名

    要实现批量,mv命令就有点力不从心了,我们可以使用一个更专业的命令rename来实现。

    例:

    $ cd /home/shiyanlou/
    $ touch file{1..5}.txt
    $ rename 's/.txt/.c/' *.txt
    $ rename 'y/a-z/A-Z/' *.c
    

    更加快捷更加方便。

    5、查看文件
    • 使用cat、tac和nl命令查看文件

    前两个命令都是用来打印文件内容到标准输出,其中cat为正序显示,tac为倒叙显示。
    例:
    要从/etc目录下拷贝来的passwd文件:

    $ cd /home/shiyanou
    $ cp /etc/passwd passwd
    $ cat passwd
    

    也可以加上 -n 参数显示行号:

    $ cat -n passwd 
    

    这里有几个参数:

    -n:设置行号样式,主要有三种:

    -n ln:在行号字段最左端显示

    -n rn:在行号字段最右边显示

    -n rz:在行号字段最右边显示


    使用more和less命令分页查看文件

    实验楼上说:cat是用来快速查看一个文件的内容的,那么more和less就是天生用来“阅读”一个文件的内容的。

    使用 more 命令打开passwd 文件:

    $ more passwd
    
    使用head和tail命令查看文件

    这两个命令对于想快速浏览的人较适合,因为只看文件头几行和尾几行,比如说要看passwd文件:

    $ tail /etc/passwd
    

    或者直接看一行,加上 -n 参数:

    $ tail -n 1 /etc/passwd
    
    6、查看文件类型

    通常用file:

    $ file /bin/ls
    

    五、环境变量与文件查找

    环境变量

    所谓变量,就是Shell变量,就是计算机用于记录一个值的符号,这些符号将用于不同的运算处理中。

    创建一个变量:


    使用declare命令创建一个 变量名为tmp的变量:

    $ declare tmp
    

    使用=号赋值运算符,将变量tmp赋值为shiyanlou:

    $ tmp=shiyanlou
    

    读取变量的值,使用echo命令和$符号($符号用于表示引用一个变量的值,想我这种菜鸡经常忘记输入):

    $ echo $ tmp
    

    环境变量

    环境变量的作用域比自定义变量的要大,如Shell的环境变量作用于自身和它的子进程。在UNIX系统中,每个进程都有其各自的环境变量设置,且默认情况下,当一个进程被创建时,除了创建过程中明确指定的话,它将继承其父进程的绝大部分设置。

    通常我们会涉及到的变量类型有三种:

    • 当前Shell进程私有用户自定义变量,如上面我们创建的tmp变量,只在当前Shell中有效。
    • Shell本身内建的变量。
    • 从自定义变量导出的环境变量。

    有三个与上述三种环境变量相关的命令:set,env,export。这三种命令仅仅是涉及的变量范围不同。

    命令 说明
    set 显示当前Shell所有变量,
    env 显示与当前用户相关的环境变量。
    export 显示从Shell中导出成环境变量的变量。

    总结一下:set包含于env,env包含于export


    那么我们举个例子,来从头梳理一下:

    $ temp=shiyanlou
    $ echo $temp
    

    上面这一步是在bash里设置temp这个变量。

    $ zsh
    $ echo $temp
    

    上面这一步是在bash里建立一个子空间,相当于在房间里的卧室。

    exit
    

    这时退出到bash里,相当于从卧室退到客厅。

    $ export temp
    $ echo $temp
    

    这时输出的结果就有shiyanlou了,说明temp有效。

    用一个例子来说明一下:相当于你家房子是bash,里面所有的卧室门、卫生间门是关闭的,你现在需要在卧室办公,你从房子外面拿了一台电脑在客厅里,这时你打开一间卧室门,但发现里面没电脑,于是退到客厅里把电脑拿到卧室里,之后再看卧室,里面有电脑了。

    按照变量的生存周期来划分,linux可以分为两类:

    • 1、永久的:需要修改配置文件,变量永久生效;
    • 2、临时的:使用export命令行声明即可,变量在关闭shell时失效。

    有两个重要文件/etc/bashrc和/etc/profile,他们分别存放的是shell变量和环境变量。

    命令的查找路径与顺序

    在shell中输入一个命令,shell是怎么知道去哪找到这个命令然后执行呢?
    是通过PATH这个环境变量来进行搜索的。
    查看环境变量的内容:

    $ echo $PATH
    

    来个实例:

    创建一个Shell叫爸爸文件:

    $ cd /home/shiyanlou
    $ touch hello_shell.sh
    $ gedit hello_shell.sh
    

    会出现脚本文件。添加以下代码:

    #!/bin/bash
    
    for((i=0;i<10;i++));do
       echo "hello shell"
    done
    
    exit 0
    

    保存然后退出。
    之后在添加可执行权限:

    $ chmod 755 hello_shell.sh
    

    执行脚本:

    $ cd /home/shiyanlou
    $./hello_shell.sh
    

    创建一个C语言“hello world”程序

    $ cd /home/shiyanlou
    $ getit hello_world.c
    

    会出现文件,输入:

    #include<stdio.h>
    
    int main(void)
    {
        printf("hello world!
    ");
        return 0;
    }
    

    保存之后用gcc生成可执行文件:

    $ gcc -o hello_world hello_world.c
    

    之后在shiyanlou下创建mybin目录,将hello_shell.sh 和 hello_world移动到里面:

    $ cd /home/shiyanlou
    $ mkdir mybin 
    $ mv hello_shell.sh hello_world mybin/
    

    现在可以在mybin下分别运行这两个程序:

    $ cd mybin
    $ ./hello_shell.sh
    $ ./hello_world
    
    添加自定义路径到“PATH”环境变量

    PATH里面的路径是以 :作为分割符的,所以:

    $ PATH=$PATH:/home/shiyanlou/mybin
    

    (要使用绝对路径)

    没学懂

    修改和删除已有变量

    变量的修改:

    变量设置方式 说明
    ${变量名#匹配字串} 从头向后开始匹配,删除符合匹配字串的最短数据
    ${变量名##匹配字串} 从头向后开始匹配,删除符合匹配字串的最长数据
    ${变量名%匹配字串} 从尾向前开始匹配,删除符合匹配字串的最长数据
    ${变量名%%匹配字串} 从尾向前开始匹配,删除符合匹配字串的最长数据
    ${变量名/旧的字串/新的字串} 将符合旧字串的第一个字串替换为新的字串
    ${变量名//旧的字串/新的字串} 将符合旧字串的全部字串替换为新的字串
    变量删除

    可以用unset命令删除一个环境变量

    $ unset temp
    
    让环境变量立即生效

    用source命令立即生效:

    $ cd /home/shiyanlou
    $ source .zshrc
    

    还有另外的写法是:.
    如果替换成 .

    $ . ./.zshrc
    
    搜索文件

    whereis 简单快速

    $ whereis who
    $ whereis find
    

    想要全面的结果是使用locate

    locate 快而全

    系统会使用定时任务每天自动执行updatedb命令更新一次,所以有时候刚添加的文件可能会找不到,需要手动执行一次updatedb命令。他可以用来查找指定目录下的不同文件类型,如查找/etc下所有以sh开头的文件:

    $ sudo apt-get update
    $ sudo apt-get install locate
    $ locate /etc/sh
    

    它不只是在/bin目录下查找,还会自动递归子目录进行查找。

    which小而精

    which本身是shell内建的一个命令,通常用which来确定是否安装了某个指定的软件,因为它只是从PATH环境变量指定的路径中去搜索命令:

    $ which man
    

    find 小而精

    find是这几个命令中最强大的,他不但可以通过文件类型、文件名进行查找而且可以根据文件属性(文件的时间戳、权限等)进行搜索。

    find命令的路径是作为第一个参数的,基本命令格式为find[path][option][action].

    与时间相关的命令参数:

    参数 说明
    -atime 最后访问时间
    -ctime 最后修改文件内容的时间
    -mtime 最后修改文件属性的时间

    六、文件打包与解压缩

    在Windows上最常见的是.zip,.7z后缀的压缩文件。而在linux上还有很多种。

    zip压缩打包程序

    使用zip打包文件夹:

    $ cd /home/shiyanlou
    $ zip -r -q -o shiyanlou.zip /home/shiyanlou/Desktop
    $ du -h shiyanlou.zip
    $ file shiyanlou.zip
    

    可以设置压缩级别为9或1,重新打包:

    $ zip -r -9 -q -o shiyanlou_9.zip /home/shiyanlou/Desktop -x ~/*.zip
    $ zip -r -1 -q -o shiyanlou_1.zip /home/shiyanlou/Desktop -x ~/*.zip
    

    1表示最快压缩但体积大,9表示体积最小但耗时最久。
    只能使用绝对路径,否则不起作用。
    再用du命令分别查看默认压缩级别、最低、最高压缩级别及未压缩文件的大小。

    $ du -h -d 0 *.zip ~ | sort
    
    创建加密zip包

    使用-e参数可以创建加密压缩包:

    $ zip -r -e -o shiyanlou_encryption.zip /home/shiyanlou/Desktip
    
    使用unzip命令解压缩zip文件

    将shiyanlou.zip解压到当前目录:

    $ unzip shiyanlou.zip
    

    使用安静模式,将文件解压到指定目录:

    $ unzip -q shiyanlou.zip -d ziptest
    
    tar 打包工具

    创建一个tar包:

    $cd /home/shiyanlou
    $ tar -cf shiyanlou.tar /home/shiyanlou/Desktop
    
    解包一个文件到指定路径的已存在目录:
    $ mkdir tardir
    $ tar -xf shiyanlou.tar -C tardir
    
    只查看不解包文件 -t参数:
    $ tar -tf shiyanlou.tar
    
    保留文件属性和跟随链接:
    $ tar -cphf etc.tar /etc
    

    对于创建不同的压缩格式的文件,只需换一个参数,就用gzip工具创建*.tar.gz文件为例来说明。
    只需在创建tar文件的基础上添加-z参数,使用gzip来压缩文件:

    $ tar -czf shiyanlou.tar.gz /home/shiyanlou/Desktop
    

    解压*.tar.gz文件:

    $ tar -xzf shiyanlou.tar.gz
    

    总结:

    • zip:

      • 打包:zip something.zip something
      • 解包:unzip something.zip
      • 指定路径:-d 参数
    • tar:

      • 打包:tar -cf something.tar something
      • 解包:tar -xf something.tar
      • 指定路径:-C 参数

    文件系统操作与磁盘管理

    基本操作

    1、查看磁盘和目录的容量

    使用df命令查看磁盘的容量

    $ df
    

    使用du命令查看目录容量:

    $ du
    
    2、创建虚拟磁盘

    dd命令用于转换和复制文件

    使用dd命令创建虚拟镜像文件
    例:

    $ dd if=/dev/zero of=virtual.img bs=1M count=256
    $ du -h virtual.img
    

    使用mkfs命令 格式化磁盘:

    $ sudo mkfs.ext4 virtual.img
    

    使用mount命令挂载磁盘到目录树“
    用mount查看已经挂载的文件系统:

    $ sudo mount 
    

    mount命令的一般格式如下:

    mount[options][source][directory]
    

    linux下的帮助命令

    内建命令与外建命令

    内建命令

    实际上是 shell 程序的一部分,其中包含的是一些比较简单的 Linux 系统命令,这些命令是写在bash源码的builtins里面的,由 shell 程序识别并在 shell 程序内部完成运行,通常在 Linux 系统加载运行时 shell 就被加载并驻留在系统内存中。而且解析内部命令 shell 不需要创建子进程,因此其执行速度比外部命令快。比如:history、cd、exit 等等。

    外建命令

    是 Linux 系统中的实用程序部分,因为实用程序的功能通常都比较强大,所以其包含的程序量也会很大,在系统加载时并不随系统一起被加载到内存中,而是在需要时才将其调入内存。虽然其不包含在 shell 中,但是其命令执行过程是由 shell 程序控制的。外部命令是在 Bash 之外额外安装的,通常放在/bin,/usr/bin,/sbin,/usr/sbin等等。比如:ls、vi等。

    help命令

    $ ls --help
    

    man 命令

    $ man ls
    

    info 命令

    $ sudo apt-get update
    $ sudo apt-get install info
    $ info ls
    

    总结:学了短短一周,我发现自己还是很多东西都不是很懂,还得多多上机练习,最让人心烦的就是虚拟机出现问题,用了各种办法解决但它也会用各种问题阻拦你解决,心态崩了。在实验楼上的学习让我能在虚拟机出现问题的情况下实现操作,也帮我解决了很多问题,想以此博客记录下第一周学习linux的情况。

  • 相关阅读:
    shell去重
    JDBC源码解析
    try catch finally
    URL
    域名与IP地址的联系与区别
    C++stack
    C++vector
    单链表常见面试题(C语言实现)
    数据库limit子句
    strcpy和memcpy的区别
  • 原文地址:https://www.cnblogs.com/cistineup/p/11484924.html
Copyright © 2020-2023  润新知