Linux基础

学习笔记之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"
var

环境变量:
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
read

(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
expr

(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 $?
test_string

(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 $?
test_num

(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
if_file

多分支语句: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
case_score

循环语句:
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
for_flie

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死循环
while :
do
命令
done

1 while :
2 do
3     echo "1111"
4 done
while

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
nutil

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单词表由位置变量提供
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
fun_user

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
makefile

 

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


转载于:https://www.cnblogs.com/hslixiqian/p/9560423.html

你可能感兴趣的:(Linux基础)