linux基础总结
Posted fqh202
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux基础总结相关的知识,希望对你有一定的参考价值。
目录相关
# 创建
mkdir -p ./d1/d2/1.txt # 可以创建多级目录
# 删除:
rm -rf d1
# 移动:
mv -r d2 d1
# 一般在移动前最好先备份目录,例如:
cp -r d d.bak
# bak后缀的文件是备份文件
# 复制:
cp -r d2 d1
-p # 保留文件属性,preserve
-a # 用于实现备份
一般用户复制多个文件或目录到一个目录,若是目录需要加上 -r 选项:
cp /bin/{zdiff,zegrep,zless} d1
# 查询:
find -type d -name '*2'
# 在当前目录以及子目录下查询名称以2结尾的目录
# 查看:
ls -l
ls -lh
# 会直接换算文件大小单位,例如kb
# 查看当前目录下所有的子目录与文件的详细信息,主要内容如下:
第一位:
_:普通文件
d:目录
l:链接文件
第2-10位:用户权限
属主权限
属组权限
其他用户
文件大小
时间戳
cd # 进入目录
pwd # 查看当前的绝对路径
tree # 查看目录树
文件相关:
# 新建
touch f1.txt
# 修改
touch -a 1.txt:更新文件的access时间
touch -m 1.txt:更新文件的modify时间
# 移动
mv ./d1/1.txt ./d2
移动前最好备份:
cp d1/1.txt d1/1.txt.bak
# 删除
rm f1.txt
# 复制
cp ./d1/1.txt ./d2
# 若文件名重名,则直接覆盖文件。
# 查询
-type d # 表示目录
-type f # 表示文件
find -type f -name '*.txt' # 在当前目录以及子目录下查询名称以2结尾的文件
# 查看
stat # 查看文件所有属性
日期相关
date 【options】【+格式】:
选项:
-d 根据给定的时间戳显示时间
[[email protected] ~]# date -d '20121212 12:12:50'
2012年 12月 12日 星期三 12:12:50 CST
-s 根据给定的时间戳设定系统时间
[email protected]:/home/fangqihan/data# date -d '20121210'
2012年 12月 10日 星期一 00:00:00 CST
[email protected]:/home/fangqihan/data# date -d '20121210'
2012年 12月 10日 星期一 00:00:00 CST
格式:
%s 显示自1970/1/1到现在经历的秒数
[[email protected] ~]# date +%s
1530198463
cal # 显示日历
clock # 系统时间
hwclock # 硬件时间
漏斗家族
输出重定向
将正确的命令结果输入到文件中:
>> # 追加重定向,追加到最后一行
echo 'hello python full stack' >> 1.txt
> # 标准重定向,先清空,再写入内容
# 注意,非常危险,会清空目标文件!
set -C # 开启防止标准重定向功能,无法覆盖已存在的文件
set +C # 关闭此功能
只将错误的命令结果输入到文件中:2>>
不论命令错误与否都输入到文件中:
# 方法1
commands >>3.txt 2>>3.txt
# 方法2
&>>
输入重定向
<
:tr ‘a-z‘ ‘A-Z‘ < 1.txt
<<
:here document此处生成文档,cat >> 1.txt << EOF
追加多行。
管道
将管道前的命令的输出当做后一个命令的输入。
# 类似输入重定向
echo helloworld | tr 'a-z' 'A-Z'
cat 1.txt |tr 'a-z' 'A-Z'
head -10 3.txt | tail 3 # 取8-10行的内容
可以连续使用管道!
|tee
:标准输出且写入到文件
echo 'hello world' |tee 2.txt # 将字符写入到2.txt中
文件内容相关
新增内容
vim
模式化编辑器,全屏编辑器
centos7安装vim:yum -y install vim
三种模式
1、编辑模式,打开vim后默认的模式,没卵用;
2、输入模式,直接可以修改文本内容;
3、末行模式,命令操作文本内容:
:10d 删除第10行
:10,20d 删除第10行-20行
模式之间转换:
编辑模式 --> 输入模式:
i 在当前光标所在字符前面进入输入模式
a 在当前光标所在字符后面进入输入模式
o 在当前光标所在行的下方新建一行,并转换为输入模式
I 在当前光标所在行的行首进入输入模式
A 在当前光标所在行的行尾进入输入模式
O 在当前光标所在行的上方新建一行并进入输入模式
输入模式 --> 编辑模式:
ESC
编辑模式 --> 末行模式:
:
末行模式 --> 编辑模式:
ESC
可能需要敲击多次
vim相关操作:
1、打开文件:
vim file 普通打开文件
vim +n file 打开文件且光标位于第n行首部
vim + file 打开文件并编辑最后一行
vim +/pattren 打开文件并定位第一次被模式匹配到的行的行首
2、关闭文件:
在末行模式下关闭文件:
:q 不保存退出
:wq 保存退出
:q! 强制退出
:w 保存退出
:w! 强行保存
:wq! 强行保存并退出
在编辑模式下退出:
ZZ
保存并退出
3、移动光标(编辑模式下)
# 逐字符移动:
箭头
# 按单词为单位移动
w # 移至下一单词的词首
e # 移至当前或下一个单词的词尾
b # 移至当前或前一个单词的词首
# 行内跳转
0 # 绝对行首
^ # 行首的第一个非空白字符
$ # 绝对行尾
# 行间跳转
nG # 直接跳转至第n行行首
G # 跳转至最后一行行首
# 在末行模式下,直接给出行号即可
# 翻屏操作(编辑模式)
ctrl+f 向下
ctrl+b 向上
4、删除(字符,单词,行):
# 命令行删除单个字符:
x # 删除光标所在处的单个字符
nx # 删除光标所在处以及向后的共n个字符
# 编辑模式下,跟跳转命令结合使用
dw # 删除当前单词
dd # 删除当前所在行
ndd # 删除当前所在行在内的n行
# 末行模式:
:2,4d # 删除第2-4行
:2,+5 # 删除第2行以及随后的5行
$d 删除最后一行
.d 删除当前行
$-1d 删除倒数第二行
5、复制命令(在编辑模式下):
y
yy 复制整行
6、粘贴命令:
p
: 若复制或删除的内容为整行内容,则粘贴至所在行的下方;复制或删除的内容为非整行,则粘贴至光标所在字符的后面;
P
: 若复制或删除的内容为整行内容,则粘贴至所在行的上方;复制或删除的内容为非整行,则粘贴至光标所在字符的前面。
7、撤销编辑操作:
u 撤销前一次的编辑操作,可以连续使用n次
nu 撤销最近n次的编辑操作
ctrl+r 撤销最近一次的撤销操作
8、重复前一次的编辑操作:.
9、查找:
/pattren
?pattren
10、查找并替换(在末行模式下)
n,ms/ad/AD/g # 在n-m行,将ad替换成AD
:1,3s/hello/hi/g # 在1-3行中将hello字符串替换为hi
echo
追加一行内容到文件末尾:
echo asasas >> file
清空原文件并写入内容:
echo asasas > file
追加多行内容:
cat >> 3.txt << EOF
> q
> w
> e
> rt
> EOF
查看内容
cat
一般查看所有内容;
-n
显示行号
-c
按字节显示,例如-c3显示前三个字节(貌似不存在)
--help
查看介绍,和man作用类似,但包含中文
head
默认查看前10行内容
-n
显示前n行
tail
默认查看后10行内容
-n
显示最后的n行
sed
stream editor行编辑器
默认不编辑原文件,仅对模式空间的数据做处理。
格式: sed ‘AddressCommands‘ file ...
options:
-n
静默模式,不显示模式空间中的内容
-i
直接修改原文件
-e
可以同时执行多个脚本
-f
保存至文件/path/to/script
, sed -f /path/to/script file
将指定文件中的脚本运行在file上
-r
表示使用扩展正则表达式
Address:与后面的commands结合使用
1、Startline、Endline
例如: 1,100
$ 表示最后一行
$-1 倒数第二行
2、/RegExp/
/^root/ # 表示以root字符串开始的行
sed '/3/d' file # 不显示包含3的行
sed -n '/a/p' 1.txt # 显示包含字符a的行
3、/pattren1/,/pattren2/
# 第一次被pattern1匹配的行开始,到第一次被pattern2匹配到的行结束中间的所有行。
sed -n '/hi/,/a/p' 1.txt # 显示从第一次匹配到字符hi和字符a以及之间所有行
4、linenumber # 指定的行
sed -n '2p' 1.txt # 显示第2行
5、Startline, +N # 从startline开始,向后的N行
sed '1,+3d' file # 删除1-4行
Commands:
1、d
# 删除(不显示)符合条件的行
sed 1,2d file # 显示除了1-2行的其他行
2、p
# 显示符合条件的行
# 结合 -n 使用,只显示符合条件的行
sed -n '/^a/p' 1.txt # 显示以a开头的所有行
3、a string
# 在指定的行的下一行后追加新的行
sed '3ahahaha' 1.txt # 在第三行下一行追加hahaha字符串
4、i string
# 在指定的行的前一行追加新的行
5、r file
# 将指定文件的内容添加至符合条件的行处
sed '3r demo1.sh' f1.txt # 读取demo1.sh的所有内容,将其放在f1.txt的第三行后面
6、w file
# 将指定文件的内容添加至指定的文件中
sed '/a/w f2.txt' f1.txt # 将f1.txt中包含字符a的行写入文件f2.txt中
7、s/pattren/string/
sed 's/a/A/' f1.txt # 将字符a替换为字符A
sed 's/.*a.*/A/' f1.txt # 将包含a的行替换字符A
-g # 全局替换,只要匹配就替换
sed 's/a/A/g' f1.txt # 替换每行中所有的a为A
-i # 忽略大小写
# 分隔符可以为 s###. [email protected]@@
# 不要使用要替换的字符为分隔符
& # 引用前面匹配到的字符串:
sed 's/a/&r/g' f1.txt # 在匹配到的a字符后追加r字符
sed 's#l(..e)#L1#g' f1.txt
# 只将以e结尾中间只有两个字符的l替换为L,例
hello,my love
hello, linux
>>>
hello,my Love
hello, linux
awk
内容比较多!
显示某一行或多行:
awk 'NR==n' 3.txt #显示第n行内容
awk "NR==n, NR==m" 3.txt # 显示n-m行的内容
grep
Global Research 根据模式搜索文本并将符合模式的文本行显示出来,部分匹配。
Patterns 由文本字符和正则表达式的元字符组合而成的匹配条件
options:
-i
忽略大小写
--color
匹配的内容高亮显示
-v
反向查找
-o
只显示匹配到的字符串
grep 'ab' 1.txt # 查看包含特定字符的所有行
grep -v '2' 1.txt # 列出所有不包含字符2的行
正则表达式:
. # 匹配任意单个字符
* # 匹配其前面的字符任意次
.* # 匹配任意多个任意字符
? # 匹配前一个字符0或1次
{n, m} # 匹配前面的字符至少n次,之多m次
^ # 字符出现在行首
$ # 字符出现再行尾
^$ # 空白行
[] # 指定集合内的任意一个字符
[^] # 非
[:digit:] # 同通配符使用
grep '[[:digit:]]' 1.txt # 匹配包含数字的行
cut
按分割后指定位置取每行对应列的内容。
-d
:指定分隔符,默认是一个空格
-f
:指定要显示的字段
例如:按照空格分割,显示每行的第一个字段
# 1.txt
1 12 asdasda
a 12as asdasdv
vc 12as asdasds
d 12a asdasdf
cut -d' ' -f1 1.txt # 先以空格分割每行,再取出每行的第一列数据显示
1
a
vc
d
cut -d' ' -f1,2 1.txt # 每行的第一个和第二个字段
cut -d' ' -f1-3 1.txt # 显示每行的第1-3个字段
sort
查看文件内容并按行排序;
默认按照行首个字符在ascii对应的十进制数字大小升序排序。
options:
-n
按照数值大小排序
-r
降序
-t
指定分隔符
-k
指定字段,sort -t: -k3 -n /ect/passwd
-u
重复行只显示一次
-f
不区分大小写
uniq
相邻并完全一样的行只显示一次
-d
显示重复行,只显示一次
-D
显示重复行,有多少显示多少
-c
显示重复的行和对应的次数
wc
统计文本内容(行,单词,字节数)
options:
-l
显示行数
-w
显示单词数
-c
显示字节数
-m
字符数
-L
最长的一行包含的字符数
[email protected]:~/data$ wc 1.txt
10 18 80 1.txt
行 单词 字节
tr
显示替换后的字符,其中ac代指集合,而非一个字符串:
tr 'ac' 'bd' < file # 将文件中的字符a替换成字符b
tr 'a-z' 'A-Z' < file # 将小写换成大写字母
-d # 删除指定的字符
tr -d '1' < file
其他概念
获取最新的linux当前最新的内核版本号:www.kernel.com
linux仅提供内核,上层软件以及库一般由GNU组织提供,都是以源代码形式提供,需要处理成可执行文件。
编译:将源代码转换成可以在对应平台cpu可以执行的二进制代码的过程。
linux发行版:
Redhat(CentOs)SUSEDebian(Ubuntu,Mint)
RedHat:通用格式,32位可以支持64位操作系统,所以编译RedHat都是很古老的版本,适用于许多系统。
Gentoo:针对当前系统对软件进行现场编译,非常耗时。
LFS:linux from scratch,自己下载各种上层软件和Lib文件。
桌面版:提高用户体验,界面漂亮
linux系统组成
硬件
kernel(操作系统):
将硬件的计算能力抽象出来以系统调用的方式交给其他上层软件。
Lib:
.so(动态库|共享库)
不能独立执行,必须被调用才会被执行。
开发环境:
shell等用户软件
bash及其特性:
shell
GUI: Gnome, KDE, Xface
CLI: sh, bash, cshell, kshell,
进程:程序的副本,谁用都会产生一个进程。进程是程序执行的实例。在进程看来,当前主机只存在内核和当前进程。
命令行光标跳转:
ctrl+a # 跳到命令行首
ctrl+e # 跳到命令行尾
ctrl+u # 删除光标至行首
ctrl+k # 删除光标只行尾
ctrl+l # 清屏
命令历史history:
用户命令历史会缓存在文件中
-c # 清空命令历史
-d600 # 删除第600个命令
-d600 10 # 指定偏移量10,删除第600-611行命令
!n # 打印命令历史第n条记录并显示执行结果
!-n # 倒数第n条命令
!! # 执行上一条命令
!string # 执行命令历史中最近一个以指定字符串开头的命令
环境变量:
echo $PATH
echo $HISTSIZE
PATH # 命令搜索路径
HISTSIZE # 命令历史缓冲区大小
命令自动补全:
tab自动补全
双击tab显示所有匹配的
命令别名alias
当前进程有效:
alias cls=clear
alias rm="rm -i"
永久生效:
切换root用户:sudo -i pwd
修改/root/.bashrc,增加命名内容
source /root/.bashrc,生效文件
解除别名:
unalias
或直接进入文件中修改。
命令替换
把命令中某个子命令替换为其执行的结果,也可以使用反引号
例1:显示命令结果:
echo "the current directory is $(pwd)"
echo "the current directory is `pwd`"
例2: 创建以当前日期为名称的文件
touch file-$(date +%d).txt
bash支持的引号:
`` # 命令替换
"" # 弱引用,可以实现变量替换
'' # 强引用,不能完成变量替换
文件名通配globbing
在利用find查询文件或目录时候使用
*
代表任意长度的任意字符
?
代表任意字符,只能代表一个字符
[]
匹配指定范围内的任意单个字符
[:space:]
[:punct:]
[:lower:]
[:upper:]
[:alnum:]
[:alpha:]
查看:man 7 glob
[^]
匹配指定范围之外的任意单个字符
$
换行符
例: ls 3*
匹配以3起始的文件或目录
ls [a-zA-Z][0-9]*
首位字母开头第二位数字后面不限的文件或目录
权限相关
文件:
r
可读,使用cat等命令查看文件内容
w
可写,可以编辑或删除
x
可执行,executable,可以在命令提示符下当做命令提交给内核运行
目录:
r
可以执行ls列出内部所有文件
w
可以在此目录创建文件
x
可以使用cd切换进此目录,可以使用ls -l查看内部文件的详细信息
用户管理
useradd
useradd tonyblair
直接创建用户,uid和Gid自动生成,若指定组的话,那么组必须提前存在。
options:一般不常使用!
-u UID
-g GID
基本组
-G GID
附加组
-c
指定注释信息
-d
指定家目录,默认 /home/username
-s
指定shell的路径,使用/etc/shells
中的某一个shell,查看默认shell :echo $SHELL
-M
没有指定家目录,无法实现环境设定
-m
允许再/home目录下再创建用户目录
usermod
usermod [option] username
options:
-u
UID,usermod -u 1111 username
-L
锁定账号
-U
解锁账号
-s
修改shell
userdel
userdel [option] USERNAME
没有指定选项,用户家目录不会被删除
-r
同时删除用户的家目录
groupmod
groupmod -g 3000 username # 修改gid和组id
passwd密码相关
选项
-l
锁定账号,当前用户不能修改密码
-u
解锁账号
当前用户生成密码:
[[email protected] ~]$ passwd
Changing password for user linuxde. # 更改linuxde用户的密码
(current) UNIX password: # 请输入当前密码
New UNIX password: # 请输入新密码
Retype new UNIX password: # 确认新密码
passwd: all authentication tokens updated successfully. # 更改成功
在root用户下生成密码:
[[email protected] ~]# passwd linuxde # 更改或创建linuxde用户的密码
Changing password for user linuxde.
New UNIX password: # 请输入新密码
Retype new UNIX password: # 再输入一次
passwd: all authentication tokens updated successfully. # 成功
生成密码后可以重新开启shell测试!
注意,若出现sodoer文件相关错误,那么就手动编辑/ect/sudoers
,
1、先修改文件权限:chmod u+w /etc/sudoers
2、增加用户组:new_user ALL=(ALL) ALL
3、撤销文件权限:chmod u+w /etc/sudoers
参考:http://man.linuxde.net/passwd
查看用户相关信息
/ect/passwd
:用户信息相关
/ect/shadow
:密码相关
从标准输入管道读入新的密码:
echo 'fqh666666' | passwd --stdin user1
id
显示当前用户的属性;
显示指定用户或组的id号,一般0是root用户,
id -u fangqihan
id -g fangqihan
id -G fangqihan
改变文件属主和属组
只能在root用户下操作
chown
change ownwer
1、改变文件属主:chown username file
2、修改目录属主,但是不能修改子文件和目录属主
-R
修改子目录和子文件的属主
-reference=/path/to/somefile file
:修改为和参考文件一样的属主
3、修改属组chown :usergrp file
4、同时修改属组和属主chown username:usergrp file
chgrp
修改属组
用法同chown
修改文件权限
设定三类用户的权限
chmod 十进制数字 file
4 r
读权限
2 w
写权限
1 x
执行权限
-R
修改目录下的所有文件
例如:
chmod 777 file
设定三类用户rwx权限
chmod 400 file
设定属主有r权限,属组和其他用户没有任何权限
注意:7 == 007
修改某类用户
u 属主
g 属组
o 其他用户
chmod u=rw- file
修改属主为读写权限
改变其他同理
可以指定多类用户权限:chmod g=r,o=r file
修改某类用户的某位权限
chmod u+x file
增加file文件属主的x权限
chmod u-x file
去掉file文件属主的x权限
chmod u-x,g-x file
去掉file文件属主和属组的x权限
chmod a+x
所有用户都加上x权限
参考其他文件修改权限:
chmod --reference=/path/file file
以数字代表权限:
0 000 --- 无权限
1 001 --x 执行
2 010 -w- 写
3 011 -wx 写和执行
4 100 r-- 读
5 101 r-x 读和执行
6 110 rw- 读写
7 111 rwx 读写执行
用户类别
管理员:0
标识
普通用户: 1-65535
标识,最多可以存在65535个用户,其中:
系统用户:1-499
,专门运行后台程序,无需登录系统;
一般用户:500-60000
。
进程的权限取决于发起者的权限,与进程文件本身的权限无关。
passwd文件介绍
/etc/passwd
文件
account
登录名
password
密码
UID
用户id
GID
组id
comment
注释
HomeDir
家目录
Shell
默认shell
密码保存在 /ect/shadow
中,经过加密,依次为:用户名、加密后的密码、最后修改时间、最短使用期限、最长使用期限、警告时间
加密方法:=
对称加密:加密和解密使用同一个密码
公钥加密:每个密码都成对出现,一个为私钥(secret key),一个为公钥(public key)
单向加密:散列加密,提取数据特征码,MD5
shell编程
解释型语言:存储字符串10
需要2bytes,而存储10 只需要1byte。
变量
内存空间的引用
命名规则:只能包含字母、数字、下划线,且不能以数字开头,且不能与系统环境变量重名,否则会覆盖。最好做到见名知意。
环境变量
当前shell进程及其子进程export varname=value
脚本在执行时会启动一个子shell进程:
命令行中启动的脚本会继承当前shell的环境变量;
系统自动执行的脚本(非命令行)就需要自我定义各环境变量。
pstree
命令查看当前是否存在子shell,exit
可以退出当前bash进程。
本地变量
仅当前bash进程有效。
变量声明和查看:
NAME=alex
echo $NAME
alex
引用变量:
${NAME}
echo "there are some ${ANIMAL}s"
注意必须使用双引号
局部变量
作用域是当前代码块,例如函数内部local varname=value
位置变量
$1 , $2, ...
传递参数给脚本。
#!/bin/bash
# demo.sh
if [ -e $1 ];then
echo 'ok'
else
echo 'no such file'
fi
在命令行直接 /absolute_path/demo.sh file_path
, 就会将file传递进去,用于判断file是否存在。
特殊变量
$?
上一个命令执行状态返回值,echo $?
,0表示正确执行,1-255表示执行错误
$#
表示参数的个数
$*
参数列表
[email protected]
参数列表
shift
默认一次踢掉一个参数
不输出结果
命令 &> /dev/null
不管命令是否执行成功,都不会输出到屏幕。
变量相关操作
设置变量:VARNAME=VALUE
修改变量:
[email protected]:~# ANIMAL=pig
[email protected]:~# echo $ANIMAL
pig
[email protected]:~# ANIMAL=$ANIMAL:sheep
[email protected]:~# echo $ANIMAL
pig:sheep
[email protected]:~# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
[email protected]:~# PATH=$PATH:/home/fangqihan/bin/
[email protected]:~# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/fangqihan/bin/
引用的变量只作为字符串:
[email protected]:~# a=2
[email protected]:~# b=3
[email protected]:~# c=$a+$b
[email protected]:~# echo $c
2+3
撤销变量:unset VARNAME
查看当前shell中的变量:set
查看当前shell中的环境变量:printenv、env、export
脚本编写
命令的堆砌,按照实际需要结合命令流程控制机制实现的源程序。
注意编写脚本时候,=
前后不要乱加空格。
创建简单的脚本
1、vim first.sh
2、首行指定魔数:#!/bin/bash
3、让系统知道文件路径,修改PATH环境变量或使用绝对路径
条件判断
条件测试类型:整数测试、字符测试、文件测试
条件判断表达式:
只适用于判断表达式结果的大小比较,不能用户判断是否存在。
格式:[ expression ]
注意,括号前后必须要空格
整数比较:
-eq
等值比较,相等为真
a=3
b=4
[ $a -eq $b ]
echo $?
1 结果错误
-ne
不等比较,不等为真
-gt
测试是否大于某个数
-lt
小于
-ge
大于或等于
-le
小于或等于
命令间的逻辑关系
与&&
:
第一个条件为false,第二条件不会再执行,最终结果已经确定;
若第一条件为true, 第二条件必须得判断;
例如脚本:如果用户存在,显示已存在,否则添加用户
#!/bin/bash
id user1 &>/dev/null && echo '用户已存在' || useradd user1
# 若用户不存在,则添加,否则显示用户已存在信息
#!/bin/bash
!id user2 && useradd user2 || echo '用户已存在'
或||
:
格式:id user6 || useradd user6
作业练习
// 1、添加三个用户user1,user2,user3,但要先判断用户是否存在,不存在再添加;
#!/bin/bash
!id user1 &> /dev/null && useradd user1 || echo '用户user1已存'
!id user2 &> /dev/null && useradd user2 || echo '用户user2已存'
!id user3 &> /dev/null && useradd user3 || echo '用户user3已存'
// 2、最后显示当前系统上共有多少个用户。
num=`wc -l /etc/passwd|cut -d' ' -f1`
echo "$num users"
//3、给定一个用户,若其uid为0,就显示此为管理员,否则,就显示其为普通用户;
# 方法1,利用逻辑判断:
#!/bin/bash
USER=user1
USER_ID=`id -u $USER`
echo $USER_ID
[ $USER_ID -eq 0 ] && echo 'admin' || echo 'common user'adasd
# 方法2,利用if控制语句:
#!/bin/bash
NAME=tony
USERID=`id -u $NAME`
if [ $USERID -eq 0 ]; then
echo "admin"
else
echo 'common user'
fi
// 5、判断当前系统是否有用户的默认shell为bash,若有,就显示有多多少个这类用户,反之,就显示没有这类用户
#!/bin/bash
grep 'bash$' /etc/passwd
RET=$?
echo $RET
if [ $RET -eq 0 ]; then
NUM=`grep 'bash$' /etc/passwd | wc -l`
echo "$NUM users"
else
echo 'no users'
fi
// 6、给定一个用户,判断其uid和gid是否一样,如果一样,就显示此用户为good_guy,反之,显示为bad guy。
#!/bin/bash
USER=user1
echo `id -u $USER`
echo `id -g $USER`
if [ `id -u $USER` -eq `id -g $USER` ]; then
echo 'good guy'
else
echo 'bad guy'
fi
//7、给定一个用户,获取其密码警告期限,而后判断用最近一次修改密码时间距今天是否小于警告期限。提示:算数运算的方法 $[$A-$B],若小于,则显示 warning;反之,显示 ok
# 思路:当前时间now,上次修改的时间last_mod
if [now-last_mod -lt warning_days];then
echo 'warning'
else
echo 'ok'
# 参考:
#!/bin/bash
now=$((`date +%s`/86400))
echo "now $now"
last_mod=`grep 'tony' /etc/shadow |cut -d : -f3`
echo "last_mod $last_mod"
warning_days=`grep 'tony' /etc/shadow |cut -d : -f6`
echo "warning_days $warning_days"
if [ $((now-last_mod)) -lt $warning_days ]; then
echo 'warning'
else
echo 'ok'
fi
if分支判断
单分支:
if 判断条件; then
statement1
statement2
...
fi
双分支:
if 判断条件; then
statement1
statement2
...
else
statement3
statement4
...
fi
多分支:
if 判断条件; then
statement1
statement2
...
elif 判断条件; then
statement1
statement2
...
elif 判断条件; then
statement1
statement2
...
else
statement3
statement4
...
fi
实例:
````
!/bin/bash
NAME=user4
if id $NAME &> /dev/null; then
echo "$NAME exist"
else
useradd NMAE
echo "add user $NAME"
fi
#### 算数运算
1、`**let 算数运算表达式**:`let C=$A + $B`
2、**[算数运算表达式]**:`C=$[$A+$B]`
3、**$((算数运算表达式))**
#### 文件测试
`-e file_path` 测试文件是否存在
`-f file_path` 测试文件是否是普通文件,
`-d file_path` 测试是否为目录
`-r file_path` 测试当前用户是否对文件有读权限
`-w file_path` 测试当前用户是否对文件有写权限
`-x file_path` 测试当前用户是否对文件有执行权限
例如:
!/bin/bash
if [ -e file ]; then
echo ‘exist‘
else
echo ‘not exist‘
`[ -x /ect/rc.d/ec.sysinit ]`: 测试当前用户是有该文件的执行权限
`bash -x demo.sh` 单步执行
**定义脚本退出状态码**:
`exit` 退出脚本
`exit # ` 若没有明确定义退出状态码,那么,执行最后一条命令的退出码即为脚本的退出状态码。
练习:
给定一个文件,若为普通文件,则显示;若是目录,亦显示,否则,显示为无法识别;
参考:
!/bin/bash
FILE=$1
if [ ! -e $FILE ]; then
echo ‘不存在‘
exit 6 # 退出码,执行后可以通过$?查看
elif [ -d $FILE ]; then
echo "derectory $FILE"
elif [ -e $FILE ]; then
echo "file $FILE"
else
echo ‘无法识别文件‘
fi
执行`/root/demo.sh /file_path`即可
#### 字符测试
#### for循环
## 磁盘管理
#### 机械式磁盘
u盘,光盘,软盘,磁带,软盘;
**结构**:
同心轴
磁臂
盘片:两面都能存储数据
磁道
真空状态:避免灰尘
高速旋转:一般在7000RPM(rotation per minute)
磁道越靠外,单位时间内划过的距离越多,效率越高。
###### 分区(partition)
实现创建独立的文件系统,按照柱面存储
**MBR**:
主引导记录,Master/Main Boot Record,512bytes,独立在操作系统之外的存储空间,其中:
前 446bytes: BootLoader,启动加载器
后64bytes:每16bytes表示一个分区,所以硬盘只能划分4个分区,扩展分区(只能是一个)+主分区<=4
最后的2bytes:Magic Number,标记MBR是否有效,
一旦损坏,系统就不能正确启动。
## 压缩、解压命令
压缩格式: `gz、bz2、xz、zip、z`
压缩算法不同,压缩比可能也不同。
**古老的压缩和解压方式**:`compress、uncompress`,压缩比较小
#### gzip
只能压缩文件
格式:`gzip /path/to/somefilefile `
`后缀.gz`,压缩后会删除源文件,压缩比>10。
·-n 1-9·,指定压缩比,默认为6
解压:
1、`-d`
2、gunzip:`gunzip /PATH/TO/SOMEFIEL.gz`
不解压查看数据:
`zcat /PATH/TO/SOMEFILE.gz`
#### bzip2
后缀`.bz2`
只能压缩文件。
比gzip有着更大的压缩比的压缩工具。
使用格式近似。
压缩后也会删除源文件。
`-k `: 压缩后保留源文件
解压:`bunzip2 /PATH/TO/SOMEFILE.bz2`
直接查看不用解压`bzcat`
#### xz
后缀` .xz`
先安装:`yum install xz`
`xz /PATH/TO/SOMEFILE`
`-k `压缩时候保留原文件
解压:`unxz`
不解压查看文件:`xzcat`
#### zip
可以将多个文件压缩成一个文件。
`zip FILE.zip file1,file2, ...`
归档:archive,归档本身并不意味着压缩。
###### tar
归档工具,只归档不压缩,体积会增大;
`-c ` 创建归档文件
`-f FILE.tar` 操作的归档文件
`tar -cf test.rar test*.txt`:将所有以test开头的文件归档起来
`-x `还原归档:`tar -xf file.tar` ,解压归档后的文件
`-xattrs `归档时,保留文件的扩展属性信息
`-t `: 不展开归档,直接查看归档了哪些文件 `tar -tf file.tar `
归档后可以再进行压缩:`xz file.tar`
`-zcf ` 调用gzip归档并压缩
`-zxf `调用gzip解压缩并展开归档
----------
## 进程管理
x86的cpu是执行环,由内到外分为0-3环,内核运行在0环,一般用户进程运行在3环。
#### 内存
**内核空间**
数据结构(task structure):与内存中的用户进程一一对应
PPID:2121
PID:7721
name:..
```
用户空间:
线性地址:只有两个进程,自己和内核,用户进程空间会被分页,每页固定大小
优先级关系:
linux系统中有0-140中优先级,数字越小优先级越高;
0-99
内核调整的,100-139
用户可控制
nice值:-20---19
,调整nice值即调整了优先级,普通用户仅能够调大自己进程的nice值,而管理员则不限制;
O标准
除了init都有父进程
ls /proc
每一个目录对应一个进程
进程分类:
跟终端有关的进程;
跟终端无关的进程。
进程状态:
D
不可中断的睡眠
R
运行或就绪
S
可中断的睡眠
T
终止
z
僵尸
<
高优先级进程
N
低优先级进程
+
前台进程组中的进程
l
多线程进程
s
会话进程
进程命令
ps
process state
BSD风格:
选项不加-
a
:显示所有跟终端有关的进程
u
:显示user
x
:显示所有与终端无关的进程
tty
:关联终端
?
:表示与终端无关
VSZ
:虚拟内存集
RSS
:常驻内存集
加了[]
的线程表示内核线程
SystemV风格:
需要-
elF
PRI:优先级
PSR:运行的当前cpu编号
NI: nice值
man ps
pstree
显示进程树
pgrep
pgrep bash
与bash相关的所有进程号
比较复杂
pidof
根据进程名查找id号
top
linux的任务管理器,处于刷新状态,每5s刷新一次
M:根据驻留内存大小进行排序
P:根据cpu使用百分比进行排序
T:根据累计时间进行排序
t
l
m
c:显示完整的命令行信息
q:退出top
k:杀死某进程
-d:指定刷新时间,top -d 1,单位s
-b: 批模式
-n#:在批模式下,显示多少批
kill
kill -l signal
1
sighup,让一个进程不用重启,就可以重读其配置文件,并让新的配置文件生效
2
sigint,中断一个进程
9
sigkill,杀死一个进程,强行杀死
15
sigterm,终止一个进程,给时间交代后事
杀死进程方式:
kill -1 信号代码
kill -SIGKILL 信号名称
kill -KILL 信号名称简写
ps aux | grep top
寻找与top相关的进程号
kill pid
killall command
会杀死与command相关的所有进程
以上是关于linux基础总结的主要内容,如果未能解决你的问题,请参考以下文章