令人心力俱疲的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!\n");
    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的情况。

上一篇:“数据库系统实验”实验报告(11)


下一篇:Linux命令基础15-ps和kill命令