预备作业一:
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的情况。