学习笔记之Linux基础:
Linux内核源码包
www.kernel.org
uname -r:查看当前的内核版本
3.5.0-23-generic
主版本号.次版本号.修订版本号-微调patch次数-内核种类
次版本号为偶数,稳定版本
次版本号为奇数,开发版本
软件包
有Debin Linux提出的Deb软件包管理机制
Redhat Linux 提出的Rpm软件包管理机制
ubuntu是基于deb软件包开发的
ubuntu有两种类型的deb软件包:
1.二进制软件包(.deb) deb软件包将二进制文件,配置文档,man,info等帮助手册合并在deb软件包中
2.源码包(.deb-src)
软件包命名格式:
sl_3.03-16_i386.deb
软件包名_软件版本-修订版本_体系结构.deb
软件包管理工具:
1.命令行 没有独立操作系统时只能以用户的形式远程登录服务器,这个时候只能选择命令行
2.文本窗口
3.图形化界面
dpkg
1.离线安装,安装前需要准备软件包
2.不会检查软件包依赖关系
sudo:临时借用超级用户权限
sudo dpkg -i 软件包 : 安装本地的Debin软件包 (后面跟的是软件包的全名)
sudo dpkg -r 软件名:移除当前安装的软件包(后面跟的是软件名) 只是删除二进制
文件,会留下配置文件(不完全删除)
sudo dpkg -P 软件名:移除已安装的软件包和配置文件(完全删除)
sudo dpkg -L 软件名:列出安装软件包的清单
apt ubuntu集中式的软件仓库机制:
软件源配置文件/etc/apt/sources.list,在这个文件中会列出最适合的软件源
索引文件/var/lib/apt/lists(列一个清单作为软件包的索引)
1.在线安装,不需要提前准备软件包
2.会自动检查软件的依赖关系,如果依赖关系不存在,会自动下载和安装
sudo apt-get upgarde:软件包的全部升级
sudo apt-get update:扫描软件源配置文件,更新索引文件
sudo apt-get install 软件名: 安装软件
1.扫描软件源配置文件和索引文件,找到相应的镜像站点,找到最新版本的软件包
2.检查软件包依赖关系
3.下载软件包
4.解压软件包,完成安装和配置
sudo apt-get remove 软件名:卸载软件(不完全卸载,会留下配置文件)
sudo apt-get --purge remove 软件名:(完全卸载软件)
sudo apt-get install 软件名 --reinstall:重新安装软件
sudo apt-get check:检查软件包依赖关系
sudo apt-get -f install:修复软件包依赖关系
软件包缓冲区: /var/cache/apt/archives
sudo apt-get clean:删除软件包缓冲区
sudo apt-get autoclean:(保留最新版本的软件包,只删除重复的软件包)
下载源码包: sudo apt-get source 软件名 注意:下载的源码包存放路径就是命令的执行路径
修改镜像地址:
1.sudo software-center
2.选左上角Edit,下拉菜单中点击software sources
3.选download form中的other
4.选择china的服务器,点chose service
5.退出窗口
6.执行sudo apt-get update,更新索引文件
shell命令
linux中使用的是bash shell,功能是完成用户与内核的交互,将用户的命令解析成操作系统明白的指令(命令解释器与windows中的dos.exe相同)
shell命令格式:
通常一个命令包括三个部分:
1.命令名称: 严格区分大小写
2.选项:由'-'或者'--'引导,用于改变命令执行的类型,选项可以同事有多个
3.参数:命令执行的对象,参数也可以同时使用多个
大多数情况下,命令参数和选项位置可以互换
三个要素之间必须用空格隔开
常用命令
linux@ubuntu:~$
linux:用户名 whoami
ubuntu:主机名 hostname
~:家目录 pwd(显示用户当前所在路径)
$:代表当前用户为普通用户
#:代表当前用户为超级用户(root)
history:查询命令历史记录
history 20:显示最近的20条命令记录
history -c:清楚当前命令记录
历史命令被保存在家目录下的配置文件.bashrc中
HISTSIZE:决定能够保存多少条命令
echo $HISTSIZE 打印HISTSIZE
在.bash_history文件中存放了之前使用过的历史命令
HISTFILESIZE:决定在文件中保留多少条命令记录
配置修改:
1.通过命令行修改:临时性,只在当前终端有限
2.修改配置文件:永久生效
保存修改后的配置文件,source+配置文件名(重启配置文件,使配置文件立即生效)
alias:给已知或已存在的命令起别名
格式:
alias 别名='已知或已存在的命令'
临时修改;
取消别名:unalias+别名
man:
man man
man 1:shell 命令
man 2:系统调用函数
man 3:库函数
man 5:配置文件
man 7:网络协议族
chmod:修改文件权限
chmod u/g/o+r/w/x 文件名
u:用户
g:用户组
o:其他
r:读权限
w:写权限
x:执行权限
-:无权限
chmod 777 文件名:将文件权限修改为最高
777:这个数组是由八进制得到,每个文件都有对应的三组权限例如:rw-rw-r-- 有权限代表1,
无权限代表0,三个二进制组合成一个八进制数,最终得到三个八进制数,就是该文件的所有权限
sudo shutdown -h now/+60 马上关机/60分钟后关机
sudo shutdown -r now/+60 马上重启/60分钟后重启
shell命令中的特殊字符
通配符:
本质:批量处理文件
*:代替任意长度的任意字符
?:代替一个长度的任意字符
[]:
ls -l [123].c:显示.c前是一个长度且为123字符的文件的详细信息
ls -l [1-3].c:同上
ls -l [^123].c:显示除了.c之前字符为123的文件的详细信息
管道符:
|
格式:命令1|命令2|命令3
功能:链接多条命令,完成特殊操作
(把前面一条命令的输出结果作为后面命令的输入)
要求:管道前的命令具有输出能力,管道后的命令具有输入能力
具有输出功能的命令:
ls:列出当前路径下的内容
cat + 文件名:列出文件里面的全部内容
head -20 文件名:列出文件前20行的内容
tail -20 文件名:列出文件后20行的内容
wc:(word count):统计内容的行数,单词数,字符数
wc + 文件名:统计文件的行数,单词数,字符数
wc也可以从终端输入数据进行统计
wc -l:统计内容的行数
wc -w:统计内容的单词数
wc -c:统计内容的字符数
ctrl + d:结束终端输入
例如:
ls /bin | wc -w
sort 文件名:对文件内容进行排序,显示
具有输入能力的常用命令:
grep:查找字符串
grep "string" 文件名:在文件中查找有字符串string的行,显示到终端
grep "^string" 文件名:显示所有开头为string的行
grep "string$" 文件名:显示所有结尾为string的行
grep "^string$" 文件名: 显示所有只有string的行
-n:显示行号
-R:递归子目录查找
grep "string" -n -R *:递归子目录查找文件中所有含string的行数和对应的文件名
vim编辑器下查找字符串
在命令模式下,直接输入/字符串 ,回车
如果有该字符串存在,以高亮的形式显示
n:光标跳到下一个
N:光标跳到上一个
取消高亮:在底行模式下输入nohl回车
输入输出重定向:
改变shell命令或程序默认的输入输出,定位到新的目标中
格式:
shell命令 重定向符 文件
输出重定向符: > >>
ls > 1.c:(新建模式) 如果文件1.c不存在,先创建文件1.c,再写入数据
如果文件存在,抹去原来的内容,重新写入新的内容
ls >> 1.c (追加模式) 如果文件不存在,先创建文件1.c,再写入数据
如果文件存在,以追加的方式进行数据的写入
错误输出重定向:
2> &>:(新建模式)
2>> &>>:(追加模式)
2> 和 2>>:只会将错误信息输出重定向到文件中
&> 和&>>:错误和正确的信息都会重定向到文件中
ls -l 文件名 > right.c 2> wrong.c
正确的保存在right.c文件中 错误的保存在wrong.c中
输入重定向:<
把文件作为内容输入给命令
wc < filename
命令置换符
功能:把一条命令的输出结果作为另外一条命令的参数
格式:
命令1 `命令2`
把命令2输出结果给命令1作为参数
ls `pwd`
ls -l `ls 18072`
ls -l `ls -a 18072`
cut:截取字符段
格式:
-d:指定分隔符
-f:根据指定分隔符,截取指定的字符段内容
cut -d ':' -f 1,4,5
根据':'截取字符段1,4,5中的内容
练习题:
前提:把/etc/passwd拷贝一份到你们的家目录
要求使用:cat head tail grep cut | `` >
查找文件中linux的信息输出到user.txt当中
1,linux所在的行
grep "linux" -n passwd > user.txt
2,linux
grep "linux" -n passwd | cut -d ':' -f 2 > user.txt
Diff
比较文件:
用于比较文件内容,比较两个不同版本的文件时可以找到改动的地方,一行一行比较
diff 1.c 2.c 比较1.c和2.c的不同之处,显示在终端上
<:文件1
>:文件2
-----:分隔符
c:change修改
a:add添加
d:delete删除
如果要生成补丁文件则需要将显示结果输出重定向到以.log为结尾的补丁文件中
diff 1.c 2.c > 3.log
patch
用法将补丁文件打补丁到需要打补丁的文件
例如:
patch 1.c 3.log
将diff比较输出重定向的补丁文件3.log安装到1.c上
撤销打补丁:
patch -R 1.c < 3.log
-R:撤销打补丁
比较目录:
注:
比较目录文件生成补丁文件操作如下:
-r:比较子目录文件
-u:以合并的方式来显示文件内容的不同,同一格式输出
-N:比较空目录时,若文件A仅出现在某个目录下,显示时,另一个目录将缺席文件视为空
1.通过比较两个文件,生成补丁文件
diff -ruN dir1 dir2 > diff.txt
2.切换到修要修改内容的文件所在的路径下
cd dir1
3.完成打补丁操作
patch -p1 < ../diff.txt
-p:去除相对路径层数的数量
4.撤销打补丁操作
patch -Rp1 < ../diff.txt
-R:撤销有新旧文件比较产生的不同之处
压缩和解压缩
归档:只是整理文件,不会改变文件总大小
压缩:压缩文件内容,将文件打包,文件总大小一般变小,节约磁盘空间
linux下常用压缩软件:
注意:压缩软件都不能对目录压缩,只能对单个文件压缩
gzip:linux使用最多的压缩软件,移植性好
格式:
gzip 文件名:默认得到的压缩文件格式: 文件名.gz
-l :查看文件压缩后信息
-num:压缩等级数越大,压缩力度也就越大
-d:解压缩 gunzip 压缩文件.gz:解压压缩文件
bzip2:压缩力度大
格式:
bzip2 文件名:默认得到的压缩文件格式: 文件名.bz2
bunzip2 压缩文件.bz2:解压压缩文件
注意:不能用两种压缩方式混合压缩文件
zip:Windows下支持zip格式
格式:
zip 文件名.zip 文件名:得到压缩文件 文件名.zip文件
unzip 文件名.zip :解压缩文件
tar:归档整理,只整理文件没有压缩
选项: -c 创建
-f 指定生成文件名
-v 显示执行过程
-x 释放
-z 指定使用gzip完成压缩
-j 指定使用bzip2完成压缩
把目录文件打包并压缩 tar -czvf 新生成的归档文件名字.tar.gz 归档压缩的目标文件
释放解压缩文件 tar -xvf 文件名.tar.gz
用户管理命令
find -name 文件名:
查找当前目录下(包括子目录)需要查找的文件显示路径在终端上(在命令执行的当前路径下查找)
echo:
在终端上打印一段文字,一般起提示作用,一般用于脚本 -n : 输出文字后不换行
命令帮助手册查询:
1.man手册 man 1 命令名
2.help选项 命令名 --help
3.info手册 info 命令名
df:查询磁盘使用情况
df -T:显示磁盘信息
df -h:带单位显示信息
du:查询文件占用磁盘空间大小
du 文件名:查看文件大小,一般kb为单位显示
-h:会把单位显示出来
passwd:修改当前用户密码 linux下每一个用户都有自己的账号和密码
root:可以修改所有人的密码
普通用户:只能修改自己的密码(sudo 可以改变)
su:临时改变用户身份
su root:临时切换到超级用户 (工作目录没有切换)
su - root:环境变量也切换到root用户的环境变量 export:(环境变量打印)
exit(退出当前用户):
临时切换身份后,记得用exit退出!
用户属性:配置文件在/etc/passwd
linux: x :1000:1000:ubuntu,,,:/home/linux:/bin/bash
linux:用户名
x:密码(隐藏了)
1000:用户编号(UID)
1000:用户组编号(GID)
ubuntu:主机名
/home/linux:家目录所在位置(工作目录)
/bin/bash:默认使用的shell命令解析器
用户组属性配置文件:/etc/group
linux:x :1000
linux:用户组名
x:用户组密码
1000:用户组编码(GID)
创建新用户:sudo adduser 用户名
1.新建用户
2.新建用户组(设置GID)
3.将新建用户添加到新建组内,设置(UID)
4.创建家目录
5.拷贝/etc/skel到家目录下
6.设置密码 和 基本信息
检查用户是否创建成功:
1.检查/etc/group
2.检查/etc/passwd
3.检查家目录 ls /home
4.检查家目录内容是否和/etc/skel相同
删除用户:
sudo deluser 用户名
注意:如果删除指定用户后,其用户组内没有成员,系统自动删除用户组
sudo deluser --remove-home 用户名:
删除用户时将工作目录同时移除
adduser的配置文件 :
/etc/adduser.conf中决定了创建时用户的ID用户组ID,
shell和家目录位置 FIRST_UID=1000 LAST_UID=29999 FIRST_GID=1000 LAST_GID=29999 DSHELL=/bin/bash DHOME=/home SKEL=/etc/skel
创建用户组:
sudo addgroup 组名:
删除用户组:
sudo delgroup 组名:注意:删除用户组的时候要确定组内没有用户
修改用户属性:usermod
修改用户名字及用户的工作目录:
sudo usermod -d /home/newname -m -l newname oldname
-m:文件不存在,强制创建
-l:新的用户名
更改用户所在组:
sudo usermod -g 新的组 用户名
新添加了一个用户没有sudo 权限,解决方法:
1.root
2.打开配置文件 vi /etc/sudoers
3.添加内容:用户名 ALL=(ALL:ALL) ALL
4.shift+:进入底行模式 w !sudo tee % 保存不了用这个保存
进程管理命令
程序执行一次的过程就是进程
ps:查看进程状态(windows的任务管理器)
ps -ef:查看进程的信息
UID:用户名 PID:进程编号 PPID:父进程编号
ps -aux:查看进程的状态
USER PID %CPU %MEM STAT
用户 进程 cpu占有率 内存占有率 进程状态
进程状态:
s:阻塞
+:进程在前台运行
R:运行
T:暂停 ctrl + z : 暂停进行
Z或者D:僵尸态(资源没有被正确回收) ctrl + c结束进程
top:进程监视
b,B进行翻页 q:退出top
kill:给进程发送信号
kill -l:列出kill命令所有支持的信号
格式:kill -信号编号 进程PID (默认发送15)
kill -9 PID:杀死进程
kill -18 PID:让进程结束暂停态
文件系统
文件系统是操作系统重要的组件,组织管理计算机上大量的存储文件,并提供用户的交互接口
磁盘文件系统:
FAT,FAT16,FAT32,NTFS windows上的文件系统
EXT3,EXT4 日志文件系统(linux上主流的文件系统,可以回溯时间点)
sudo fdisk -l:查看磁盘分区情况
/dev/sda1: sd:SCSI(SATA)的硬盘 hd:IDE的硬盘(现在不太用)
a:代表硬盘标号,第一块硬盘
1:分区编号(1~4,主分区) 交换分区(swapping) 内存的1.5~2倍左右,
一般在硬盘的起始位置 缓解cpu和内存压力
网络文件系统 NFS(网络文件系统),samba 通过网络获取文件系统
文件系统逻辑结构: windows:目录属于分区
linux:分区属于目录
linux:一切接文件 bcd-lsp
b:块设备文件(存储设备) c:字符设备(键盘,鼠标) d:目录文件
-:普通文件 l:链接文件 s:套接字文件 p:管道文件
/:根目录
/bin:可执行程序 /etc:配置文件 /lib:库文件 /usr/include:C库文件
/dev:设备驱动 /mnt:文件系统挂载点 /boot:系统启动文件
文件系统相关的命令
ls -i:显示文件的inode号,inode号唯一
file + 文件名:查看文件的类型
ln:创建连接文件
软链接:(符号链接):相当于快捷方式
格式:
ln -s 源文件 软链接文件名(源文件在修改时,写上绝对路径,不然可能导致链接文件失败)
1.如果修改源文件或者链接文件,另一个文件也会做同步修改
2.删除源文件,软连接文件失效,再次创建同名的文件时,软链接文件生效
3.软链接文件会占用存储空间(独立的inode号)
4.可以对目录创建软链接
5.可以跨文件系统,但是创建的软链接必须是处于linux环境下
硬链接:相当于给源文件起别名,利用(inode)产生新的名字
格式:
ln 源文件 硬链接文件名
1.如果修改源文件或者链接文件,另一个文件也会做同步修改
2.删除源文件,硬连接文件不失效
3.硬链接文件不会占用存储空间(inode号和原文件一样)
4.不可以对目录创建硬链接
5.不可以跨文件系统
网络管理命令
ifconfig:查询当前ip
sudo ifconfig 网卡名(eth0) IP地址 :临时修改
sudo dhclient(动态获取ip):临时获取
sudo /etc/init.d/networking restart :网络重启
ping -c 3 www.baidu.com
检查与百度通不通,-c后是指定次数
shell
编译性语言 C语言
1.需要编译
2.编译时不能出错,运行时也不能出错
3.执行效率高
解释性语言 脚本语言
1.不需要编译
2.运行时出错位置不会影响后期代码运行
3.执行效率较差
shell脚本:shell命令的有序集合
创建脚本文件:
1.以.sh为结尾
vi xxx.sh
2.赋予执行权限
chmod u+x xxx.sh chmod 777 xxx.sh
3.运行
(1) ./xxx.sh
(2) bash xxx.sh
(3) source xxx.sh
shell脚本语言
变量:
1.没有数据类型 没有存储类型
2.引用变量时加$
用户自定义变量:
注:
1.变量和赋值符号之间不能出现空格
2.脚本中""和''用法一致
echo:打印命令
echo "数据" 按原型输出
1 var=10 2 var1="hello world" 3 var2='hello world' 4 5 echo $var 6 echo $var1 7 echo "$var2"
环境变量:
export env
位置变量:(类似命令行传参)
$0: 类似argv[0]
$1~&9: argv[1] ~ argv[9] ${10}
$*和$@: 显示所有的位置变量 也不显示$0
$#: 类似argc 统计位置变量的个数不计算$0
$?: (1)判断上一条shell命令的执行和结果
0成立 1不成立
(2)函数返回值
$$: 显示当前脚本文件的进程编号
shell语句:
说明性语句:注释 #
#!/bin/bash 告诉编译器使用bash shell执行文件
功能性语句:
(1)输入语句:
read:
read 变量:从标准输入读入一行作为数据保存到变量
1 #!/bin/bash 2 3 4 5 #read var 6 read var1 var2 var3 7 8 9 #echo $var 10 echo $var1 11 echo $var2 12 echo $var3
(2)运算语句:
expr:
运算符:+,-,/,%,\*
格式:expr 变量1 运算符 变量2
注:
1.运算符左右两边必须出现空格
2.将命令的结果赋值给其他变量时需要添加``命令置换符
例如:
var=`expr $num1 + $num2` == ((var = num1 + num2))
1 #!/bin/bash 2 3 read num1 num2 4 5 var=`expr $num1 \* $num2` 6 7 ((var1 = num1 + num2)) 8 #var1=`ls -l` 9 10 echo $var 11 echo $var1
(3)测试语句:
test:
(1)判断字符串 类似strcmp
test 字符串1 =/!= 字符串2
[]代替test
[ 字符串1 =/!= 字符串2 ]
注:'['的右边以及']'的左边必须出现空格
1 #!/bin/bash 2 3 num1='hello' 4 num2='hello' 5 6 #test $num1 = $num2 7 [ $num1 = $num2 ] 8 echo $?
(2)比较数值大小
test 数值1 选项 数值2
选项: -eq 等于 -ne 不等于 -gt 大于 -ge 大于等于
-lt 小于 -le 小于等于
[ 数值1 选项 数值2 ]
例如:100
两句test: && 与 ||或
test $num -gt 100 && test $num -lt 200
[ $num -gt 100 ]&&[ $num -lt 200 ]
一句test: -a 与 -o或
test $num -gt 100 -a $num -lt 200
[ $num -gt 100 -a $num -lt 200 ]
#!/bin/bash read num test $num -gt 100 && test $num -lt 200 echo $? [ $num -gt 100 ]&&[ $num -lt 200 ] echo $? test $num -gt 100 -a $num -lt 200 echo $? [ $num -gt 100 -a $num -lt 200 ] echo $?
(3)测试文件属性
test 选项 文件名
选项: -e 是否存在 -f 是否为普通文件 -d 是否为目录文件
-r -w -x
! -e 是否不存在
[ 选项 文件名 ]
逻辑语句:
if:二分支语句
if 表达式
then
命令表
fi
注:
1.判断表达式,成立执行then中语句块,失败不执行
2.if和表达式之间有空格,且if和fi保持成对出现
if_else格式:
if 表达式
then
命令表1
else
命令表2
fi
if_else if_else if_else格式:
if 表达式1
then
命令表1
else if 表达式2
命令表2
else if 表达式3
命令表3
else
命令表4
fi
fi
fi
1 #!/bin/bash 2 3 echo -n "please input a filename:" 4 5 read filename 6 7 if [ ! -e $filename ] 8 then 9 echo "no such file" 10 exit 11 fi 12 13 if [ -f $filename ] 14 then 15 ls -l $filename 16 else if [ -d $filename ] 17 then 18 echo "delete it?[y|n]" 19 read cmd 20 if [ $cmd = 'y' ] 21 then 22 rm -r $filename 23 else 24 echo "it is a dir" 25 fi 26 else 27 echo "other file" 28 fi 29 fi
多分支语句:case
case 变量(引用) in
模式1) 满足该形式: 模式1|模式2)
命令列表1
;; 类似break,不能省略
模式2)
命令列表2
;;
.
.
.
*) 类似default
命令列表n
;;
esac
1 #!/bin/bash 2 3 4 5 read score 6 7 if [ $score -gt 100 -o $score -lt 0 ] 8 then 9 echo "error,exit!" 10 exit 11 fi 12 13 14 cmd=`expr $score / 10` 15 16 case $cmd in 17 10 | 9) 18 echo "A" 19 ;; 20 8) 21 echo "B" 22 ;; 23 6 | 7) 24 echo "C" 25 ;; 26 *) 27 echo "NO PASS" 28 ;; 29 esac
循环语句:
for
1 #!/bin/bash 2 3 4 5 if [ $# -ne 1 ] 6 then 7 echo "please input a path" 8 exit 9 fi 10 11 12 anx=`ls $1` 13 14 num=0 15 16 for name in $anx 17 do 18 ((num++)) 19 done 20 21 echo $num
while 表达式
do
命令列表
done
1 #!/bin/bash 2 3 4 5 num=1 6 sum=0 7 8 while [ $num -le 100 ] 9 do 10 # sum=`expr $sum + $num` 11 # num=`expr $num + 1` 12 ((sum = sum + num)) 13 ((num++)) 14 done 15 16 echo $sum
while死循环
while :
do
命令
done
1 while : 2 do 3 echo "1111" 4 done
until 表达式
do
命令
done
注:直到表达式成立时结束循环
1 #!/bin/bash 2 3 4 num=1 5 sum=0 6 7 until [ $num -gt 100 ] 8 do 9 sum=`expr $sum + $num` 10 num=`expr $num + 1` 11 done 12 13 echo $sum
break
continue 和C语言一致
for 变量 in 单词表
do
命令
done
注:for循环执行的次数由单词表中单词(以空格作为区分)个数决定,且每一次循环变量会从单词表中获取单词
1 #!/bin/bash 2 3 info='a b c d e f' 4 5 #for var in a b c d e f 6 for var in $info 7 do 8 echo $var 9 echo "************" 10 done
该形式的for单词表由位置变量提供
for 变量
do
命令
done
shell中函数:
函数定义:
1.funname()
{
命令列表
}
2.function funname()
{
命令列表
}
函数返回值使用return时只能返回0~255的数值
通过变量传递(脚本中定义的变量本质都是全局的,加上local定义变量则是局部的变量)
$?可以用于接收函数的返回值
函数调用
函数名直接使用就表示调用,后面可以添加传递的参数(多个参数空格隔开)
函数主体则利用位置变量接收传参
1 #!/bin/bash 2 3 4 function check_usr() 5 { 6 exist=`cat /etc/passwd | cut -d ':' -f 1 | grep "^$1$" | wc -l` 7 8 if [ $exist -eq 0 ] 9 then 10 return 0 11 else 12 line=`cat /etc/passwd | cut -d ':' -f 1 | grep "^$1$" -n | cut -d ':' -f 1` 13 return $line 14 fi 15 } 16 17 function show_usr() 18 { 19 info=`cat /etc/passwd | head -$1 | tail -1` 20 echo $info 21 } 22 23 echo ">>START<<" 24 25 while : 26 do 27 echo -n "please input a user name:" 28 29 read usrname 30 31 if [ $usrname = 'quit' ] 32 then 33 echo ">>END<<" 34 exit 35 fi 36 37 check_usr $usrname 38 ret=$? 39 40 if [ $ret -eq 0 ] 41 then 42 echo "no such user" 43 continue 44 fi 45 46 show_usr $ret 47 48 done
cat
cut -d '分隔符' -f n
例如:cat /etc/passwd | cut -d ':' -f 1,3
grep "^string$" -n
wc -l 行 -c 字符 -w 单词数
head
tail
工程管理工具 make
管理多个文件,make只会将时间戳发生变化的文件编译
Makefile文件:make能够唯一自动识别和读入的配置文件
命名格式:
1.Makefile , makefile ,GNUmakefile
在同一路径下只能使用其中一个,执行方式:make
2.xxx.mk xxx.Linux xxx.AIX
执行方式: make -f
1.c 2.c 3.c main.c ---> 1.o 2.o 3.o main.o ----> a.out 最终目标
目标文件 1.o
依赖文件 1.c
最终目标 a.out
注:对于make来说得到最终目标时则结束,对于Makefile文件来说,处于文件最开始的目标文件就是最终目标文件
显示规则:
目标文件:依赖文件
快捷清楚:clean 纤细见代码
make clean 运行
伪目标声明:防止出现目标与该路径下有同名文件存在,导致make执行时受到干扰
.PHONY:目标名字
touch:刷新时间戳
变量: 引用变量记得加$ {}或()
用户自定义变量
1. 变量 = 值 支持变量向后引用
2. 变量 := 值 不支持变量向后引用
3. 变量 += 值 追加赋值,且支持向后引用
4. 变量 ?= 值 支持向后引用 如果该变量之前赋值过了,则该语句失效,反之,执行
预定义变量
CC == cc
自动变量
$*:表示目标文件的名字不包含扩展名 例如.c .o .txt
$@:代表目标文件
$<:代表第一个依赖文件
$^:代表所有不重复的依赖文件
1 .PHONY:clean 2 3 VAR = -Wall -c 4 5 stu:fun1.o fun2.o fun3.o main.o 6 gcc -Wall $^ -o $@ 7 8 fun1.o:fun1.c 9 $(CC) $(VAR) $< -o $@ 10 fun2.o:fun2.c 11 ${CC} $(VAR) fun2.c -o $*.o 12 fun3.o:fun3.c 13 gcc $(VAR) fun3.c -o $@ 14 main.o:main.c 15 gcc $(VAR) main.c -o $*.o 16 17 clean: 18 rm *.o stu
make:
make -f 文件 指定文件按makefile文件执行
make -l 或略错误执行
make -n 模拟执行
make -C 指定一个目录下的makefile文件执行
隐式规则:
tftp与nfs搭建:
tftp:
1.安装tftp客户端和服务器
sudo apt-get install tftp-hpa
sudo apt-get install tftpd-hpa
2.修改配置文件
sudo vi /etc/default/tftpd-hpa
3.创建tftpboot目录
cd /
sudo mkdir tftpboot
sudo chmod 777 tftpboot
4.重启tftp服务
sudo service tftpd-hpa restart
5.测试
不要在/目录下操作
tftp 对方ip地址
get 文件 下载
put 文件 上传
退出:quit
nfs:
1.安装nfd服务器
sudo apt-get install nfs-kernel-server
2.配置文件
sudo vi /etc/exports
/rootfs *(rw,sync,no_root_squash)
3.创建rootfs
cd /
sudo mkdir rootfs
sudo chmod 777 rootfs
4.重启服务
sudo /etc/init.d/nfs-kernel-server restart
5.测试
mount -t nfs 对方ip地址:/rootfs /mnt
例如:sudo mount -t nfs 192.168.2.242:/rootfs /mnt
注:不能再挂载点操作卸载
sudo umount /mnt