简单理解:将软件嵌入到硬件当中,使其变得智能
嵌入式系统(官方): 嵌入式系统是以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统
鼠标,键盘,交换机,路由器,智能手表,智能洗衣机,手机
一个程序,管理计算机上的软硬件资源
嵌入式系统功耗低,体积小,专用性强。
特点
1)可裁剪性。支持开放性和可伸缩性的体系结构。
2)强实时性。EOS实时性一般较强,可用于各种设备控制中。
3)统一的接口。提供设备统一的驱动接口。
4)操作方便、简单、提供友好的图形GUI和图形界面,追求易学易用。
5)强稳定性,弱交互性。嵌入式系统一旦开始运行就不需要用户过多的干预、这就要负责系统管理的EOS具有较强的稳定性。嵌入式操作系统的用户接口一般不提供操作命令,它通过系统的调用命令向用户程序提供服务。
6)固化代码。在嵌入式系统中,嵌入式操作系统和应用软件被固化在嵌入式系统计算机的ROM中。
7)良好的移植性更,也就是好的硬件适应性。
1.开源免费
2.内核可裁剪,内核小 - 2G
3.移植性比较好
4.安全性高
Linux内核:
1.文件管理
2.内存管理
3.网络管理
4.设备管理
5.进程管理
shell:被称为命令行解释器,可以看作是一种程序软件. shell提供了应用于操作系统交互的功能,实
现对操作系统的保护...(作用:解释shell命令 例如:ls、cd....)
应用程序:操作系统上基础的一些应用,这些应用一般会和操作系统一起被安装.
图形用户界面(GUI)——X window、KDE、GNOME
管理程序(控制中心):设置桌面系统的外观、功能、行为、感觉等
应用程序:Linux中可以安装的应用程序举不胜举。Openoffice、firefox、Gaim、XPlay等等
编程工具: 包括用来创建专业接口的应用程序和库的编程应用程序GCC,java Elcalisp
├── bin -> usr/bin # 用于存放二进制命令
├── boot # 内核及引导系统程序所在的目录
├── dev # 所有设备文件的目录(如磁盘、光驱等)
├── etc # 配置文件默认路径、服务启动命令存放目录
├── home # 用户家目录,root用户为/root
├── lib -> usr/lib # 32位库文件存放目录
├── lib64 -> usr/lib64 # 64位库文件存放目录
├── media # 媒体文件存放目录
├── mnt # 临时挂载设备目录
├── opt # 自定义软件安装存放目录
├── proc # 进程及内核信息存放目录
├── root # Root用户家目录
├── run # 系统运行时产生临时文件,存放目录
├── sbin -> usr/sbin # 系统管理命令存放目录
├── srv # 服务启动之后需要访问的数据目录
├── sys # 系统使用目录
├── tmp # 临时文件目录
├── usr # 系统命令和帮助文件目录
└── var # 存放内容易变的文件的目录
#vi是Visual Interface的缩写,即可视化接口
#vim是Visual Improve的缩写,即vi的增强版(具有语法着色功能)
#基本上vi可以分为三种状态,分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode)
#逐字符移动
k ↑
h l ← →
j ↓
#h:移动#个字符
#以单词为单位移动
w #移到下一个单词的词首
e #跳至当前或下一个单词的词尾
b #跳至当前或上一个单词的词首
nw #表示移动n个单词
#行内(当前行)跳转
0 #绝对行首
^ #行首第一个非空白字符
$ #绝对行尾
#行间跳转
nG #跳转到第n行
G #最后一行
#翻页
Ctrl+f #向下翻一屏
Ctrl+b #向上翻一屏
Ctrl+d #向下翻半屏
Ctrl+u #向上翻半屏
#删除单个字符
x #删除光标所在字符
nx #删除光标所在的n个字符
#删除命令 d
#使用方法1:删除命令加移动命令组合使用,例如
ndw #删除光标到其后n个单词词首的所有字符
#使用方法2:dd
dd #删除光标所在行
ndd #删除光标所在后的n行(包含光标所在行)
#复制命令y
#使用方法1:删除命令加移动命令组合使用,例如
nyw #复制光标到其后n个单词词首的所有字符
#使用方法2:dd
yy #复制光标所在行
nyy #复制光标所在后的n行(包含光标所在行)
#粘贴命令p/P
p(小写p)
#如果删除的或复制的为整行内容,则粘贴到光标所在行的下方,如果复制或删除的内容为非整行,则粘贴至光标所在字符的后面
P(大写P)
#如果删除的或复制的为整行内容,则粘贴到光标所在行的上方,如果复制或删除的内容为非整行,则粘贴至光标所在字符的前面
r #单字符替换,会替换光标选中字符
R #替换模式,可以做字符替换。
#撤销命令u
u #撤销前一次编辑操作
nu #直接撤销n次操作
Ctrl+r #撤销最近一次撤销操作
#在命令模式下按v:
v(小写) #按字符选取,键盘控制光标 划过 的区域被选取
V(大写) #按矩形选取,键盘控制光标划过的行被选取
. #上一次dd删除了一行,现在输入.就可以重复dd删除行的操作
. #表示当前行
$ #表示最后一行
n #表示第n行
+n #表示向下n行
$-n #表示向上n行
#删除符号可以配合位置符合使用
dn #表示n行
start,end+d #删除start到end行的所有行 10,20d
#冒号加上位置符号,就可以跳转到某行
:n #跳转到n行
:$ #跳转到最后一行
/PATTERN:从当前位置向后查找
?PATTERN:从当前位置向前查找
n:向下查找
N:向上查找
w #保存
q #退出
! #强制执行 必须跟在命令之后
a #所有
q! #强制退出
qa #退出所有
! command #!在最前面
! ls /etc/ #会列出/ect目录下所有文件及目录 按enter后回到vim编辑状态
set nu #显示行号(set number)
set nonu #取消显示行号
set ic #忽略大小写(set ignorecase)
set noignorecase #区分大小写
set ai #自动缩进(set autoindent)
set noai #取消自动缩进
set hlsearch #高亮显示搜索到的文本
set nohlsearch #取消高亮显示搜索到的文本
syntax on #打开语法高亮显示
syntax off #关闭语法高亮显示
#如何进入
a #在光标后插入
i #在光标所在位置插入
o #在光标所在位置的下一行插入
#在插入模式下可以进行输入字符
vi FILE1 FILE2 FILE3 #同时打开三个文件
:next #切换到下一个文件
:prev #切换到上一个文件
:last #切换到最后一个文件
:first #切换到第一个文件
:qa #全部退出
#分割显示
vi -o 1.c 2.c #水平分割显示(小写)
vi -O 1.c 2.c #垂直分割显示(大写)
#在窗口间切换光标
Ctrl+w,ARROW #,表示先按Ctrl+w再按方向键(或hjkl)
Ctrl+w,→ #(使用箭头方向键)光标切换到右边的窗口
Ctrl+w,h #(左), j(下), k(上), l(右) 也可以切换窗口
全局vim配置文件:/etc/vimrc
个人vim配置文件:~/.vimrc
sudo apt-get install vim #安装vim
"Keyboard COMMANDS: {{{1
nmap gg=G
nmap :TlistToggle
" nmap <F6> :NERDTreeToggle<cr>
nmap <F4> :MRU<cr>
"nmap LookupFile
" nmap <F9> :call RunShell("Generate tags", "ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .")<cr>
"nmap :call HLUDSync()
" nmap <F11> :call RunShell("Generate filename tags", "~/.vim/shell/genfiletags.sh")<cr>
"nmap :call RunShell(" Generate cscope", "cscope -Rb"):cs add cscope.out
" Parentheses are automatically completed:
if &term=="xterm"
set t_Co=8
set t_Sb=^[[4%dm
set t_Sf=^[[3%dm
endif
let g:neocomplcache_enable_at_startup = 1
function! ClosePair(char)
if getline('.')[col('.')] - 1== a:char
return "\"
else
return a:char
endif
endfunction
map <F6> :call CompileRunGcc()<CR>
func! CompileRunGcc()
exec "w"
if &filetype == 'c'
exec "!gcc % -o %<"
exec "! ./%<"
elseif &filetype == 'cpp'
exec "!g++ % -o %<"
exec "! ./%<"
elseif &filetype == 'java'
exec "!javac %"
exec "!java %<"
elseif &filetype == 'sh'
:!./%
endif
endfunc
" AUTO COMMANDS: {{{1
"auto expand tab to blanks
"autocmd FileType c,cpp set expandtab
autocmd FileType c,cpp map :w:make
" Restore the last quit position when open file.
autocmd BufReadPost * if line("'\"") > 0 && line("'\"") <= line("$") | exe "normal g'\"" | endif
" SHORTCUT SETTINGS: {{{1
" Set mapleader
let mapleader=","
" Space to command mode.
nnoremap :
vnoremap :
" Switching between buffers.
nnoremap <C-h> <C-W>h
nnoremap <C-j> <C-W>j
nnoremap <C-k> <C-W>k
nnoremap <C-l> <C-W>l
inoremap <C-h> <Esc><C-W>h
inoremap <C-j> <Esc><C-W>j
inoremap <C-k> <Esc><C-W>k
inoremap <C-l> <Esc><C-W>l
" "cd" to change to open directory.
let OpenDir=system("pwd")
nmap cd :exe 'cd ' . OpenDir:pwd
" PLUGIN SETTINGS: {{{1
" taglist.vim
let g:Tlist_Auto_Update=1
let g:Tlist_Process_File_Always=1
let g:Tlist_Exit_OnlyWindow=1
let g:Tlist_Show_One_File=1
let g:Tlist_WinWidth=25
let g:Tlist_Enable_Fold_Column=0
let g:Tlist_Auto_Highlight_Tag=1
" NERDTree.vim
let g:NERDTreeWinPos="right"
let g:NERDTreeWinSize=25
let g:NERDTreeShowLineNumbers=1
let g:NERDTreeQuitOnOpen=1
" cscope.vim
if has("cscope")
set csto=1
set cst
set nocsverb
if filereadable("cscope.out")
cs add cscope.out
endif
set csverb
endif
" OmniCppComplete.vim
set nocp
filetype on
filetype plugin on
let g:OmniCpp_DefaultNamespaces=["std"]
let g:OmniCpp_MayCompleteScope=1
let g:OmniCpp_SelectFirstItem=2
" VimGDB.vim
if has("gdb")
set asm=0
let g:vimgdb_debug_file=""
run macros/gdb_mappings.vim
endif
" LookupFile setting
let g:LookupFile_TagExpr='"./tags.filename"'
let g:LookupFile_MinPatLength=2
let g:LookupFile_PreserveLastPattern=0
let g:LookupFile_PreservePatternHistory=1
let g:LookupFile_AlwaysAcceptFirst=1
let g:LookupFile_AllowNewFiles=0
" Man.vim
source $VIMRUNTIME/ftplugin/man.vim
" snipMate
let g:snips_author="Du Jianfeng"
let g:snips_email="[email protected]"
let g:snips_copyright="SicMicro, Inc"
" plugin shortcuts
function! RunShell(Msg, Shell)
echo a:Msg . '...'
call system(a:Shell)
echon 'done'
endfunction
nmap <leader>sa :cs add cscope.out<cr>
nmap <leader>ss :cs find s <C-R>=expand("" )<cr><cr>
nmap <leader>sg :cs find g <C-R>=expand("" )<cr><cr>
nmap <leader>sc :cs find c <C-R>=expand("" )<cr><cr>
nmap <leader>st :cs find t <C-R>=expand("" )<cr><cr>
nmap <leader>se :cs find e <C-R>=expand("" )<cr><cr>
nmap <leader>sf :cs find f <C-R>=expand("" )<cr><cr>
nmap <leader>si :cs find i <C-R>=expand("" )<cr><cr>
nmap <leader>sd :cs find d <C-R>=expand("" )<cr><cr>
nmap <leader>zz <C-w>o
nmap <leader>gs :GetScripts<cr>
let Tlist_Show_One_File=0
set noswapfile
set tags+=/usr/include/tags
set tags+=./tags
map ta :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q.<CR>
"
" Copyright (c) 2010 Jeffy Du. All Rights Reserved.
"
" Maintainer: Jeffy Du <[email protected]>
" Created: 2010-01-01
" LastChange: 2010-04-22
" GENERAL SETTINGS: {{{1
" To use VIM settings, out of VI compatible mode.
set nocompatible
" Enable file type detection.
filetype plugin indent on
" Syntax highlighting.
syntax on
syntax enable
" Setting colorscheme
" Other settings.
set autoindent
set cindent
set autoread
set autowrite
set background=dark
set backspace=indent,eol,start
set nobackup
"set cinoptions=:0
set cursorline
set completeopt=longest,menuone
set noexpandtab
set fileformat=unix
if version >= 603
set helplang=cn
set encoding=utf-8
endif
set foldmethod=marker
set history=500
set hlsearch
set ignorecase
set incsearch
set mouse=a
set number
set pumheight=10
set ruler
set scrolloff=3
set shiftwidth=4
set showcmd
set smartindent
set smartcase
set smarttab
set tabstop=4
set iskeyword+=_,$,@,%,#,-
set novisualbell
set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")}
set laststatus=2
set magic " 设置魔术
set guioptions-=T " 隐藏工具栏
set guioptions-=m " 隐藏菜单栏
"Set File Title: {{{1
autocmd BufNewFile *.cpp,*.[ch],*.sh,*.py,*.java exec ":call SetTitle()"
func SetTitle()
if &filetype == 'sh'
call setline(1,"\#!/bin/bash")
call append(line("."),"\#############################################################")
call append(line(".")+1,"\# File Name : ".expand("%"))
call append(line(".")+2,"\# Creator : 程云浩")
call append(line(".")+3,"\# QQ : 1877090085")
call append(line(".")+4,"\# Email : [email protected]")
call append(line(".")+5,"\# Creat Time : ".strftime("%c"))
call append(line(".")+6,"\# 备注 : ")
call append(line(".")+7,"#############################################################/")
call append(line(".")+8,"")
elseif &filetype == 'python'
call setline(1,"\#!/usr/bin/env python")
call append(line("."),"\#############################################################")
call append(line(".")+1,"\# File Name : ".expand("%"))
call append(line(".")+2,"\# Creator : 程云浩")
call append(line(".")+3,"\# QQ : 1877090085")
call append(line(".")+4,"\# Email : [email protected]")
call append(line(".")+5,"\# Creat Time : ".strftime("%c"))
call append(line(".")+6,"\# 备注 : ")
call append(line(".")+7,")+6,"\#############################################################")
call append(line(".")+8,"")
else
call setline(1, "/**************************************************************")
call append(line("."), " * File Name : ".expand("%"))
call append(line(".")+1," * Creator : 程云浩")
call append(line(".")+2," * QQ : 1877090085")
call append(line(".")+3," * Email : [email protected]")
call append(line(".")+4," * Creat Time : ".strftime("%c"))
call append(line(".")+5," * 备注 : ")
call append(line(".")+6,"***************************************************************/")
endif
if expand("%:e") == 'h'
call append(line(".")+7, "#ifndef _".toupper(expand("%:t:r"))."_H")
call append(line(".")+8, "#define _".toupper(expand("%:t:r"))."_H")
call append(line(".")+9, "")
call append(line(".")+10, "")
call append(line(".")+11, "#endif")
elseif &filetype == 'cpp'
call append(line(".")+7, "#include " )
call append(line(".")+8, "using namespace std;")
call append(line(".")+9, "")
call append(line(".")+10, "int main(int argc, char *argv[])")
call append(line(".")+11, "{")
call append(line(".")+12, "")
call append(line(".")+13, " return 0;")
call append(line(".")+14, "}")
elseif &filetype == 'cc'
call append(line(".")+7, "#include " )
call append(line(".")+8, "using namespace std;")
call append(line(".")+9, "")
call append(line(".")+10, "int main(int argc, char *argv[])")
call append(line(".")+11, "{")
call append(line(".")+12, "")
call append(line(".")+13, " return 0;")
call append(line(".")+14, "}")
elseif &filetype == 'c'
call append(line(".")+7, "#include " )
call append(line(".")+8, "#include " )
call append(line(".")+9, "#include " )
call append(line(".")+10, "")
call append(line(".")+11, "int main(int argc, char *argv[])")
call append(line(".")+12, "{")
call append(line(".")+13, "")
call append(line(".")+14, " return 0;")
call append(line(".")+15, "}")
endif
endfunc
"Keyboard COMMANDS: {{{1
nmap gg=G
nmap :TlistToggle
" nmap <F6> :NERDTreeToggle<cr>
nmap <F4> :MRU<cr>
"nmap LookupFile
" nmap <F9> :call RunShell("Generate tags", "ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .")<cr>
"nmap :call HLUDSync()
" nmap <F11> :call RunShell("Generate filename tags", "~/.vim/shell/genfiletags.sh")<cr>
"nmap :call RunShell(" Generate cscope", "cscope -Rb"):cs add cscope.out
" Parentheses are automatically completed:
if &term=="xterm"
set t_Co=8
set t_Sb=^[[4%dm
set t_Sf=^[[3%dm
endif
let g:neocomplcache_enable_at_startup = 1
function! ClosePair(char)
if getline('.')[col('.')] - 1== a:char
return "\"
else
return a:char
endif
endfunction
map <F6> :call CompileRunGcc()<CR>
func! CompileRunGcc()
exec "w"
if &filetype == 'c'
exec "!gcc % -o %<"
exec "! ./%<"
elseif &filetype == 'cpp'
exec "!g++ % -o %<"
exec "! ./%<"
elseif &filetype == 'java'
exec "!javac %"
exec "!java %<"
elseif &filetype == 'sh'
:!./%
endif
endfunc
" SHORTCUT SETTINGS: {{{1
" Set mapleader
let mapleader=","
" Space to command mode.
nnoremap :
vnoremap :
" Switching between buffers.
nnoremap <C-h> <C-W>h
nnoremap <C-j> <C-W>j
nnoremap <C-k> <C-W>k
nnoremap <C-l> <C-W>l
inoremap <C-h> <Esc><C-W>h
inoremap <C-j> <Esc><C-W>j
inoremap <C-k> <Esc><C-W>k
inoremap <C-l> <Esc><C-W>l
" "cd" to change to open directory.
let OpenDir=system("pwd")
nmap cd :exe 'cd ' . OpenDir:pwd
" PLUGIN SETTINGS: {{{1
" taglist.vim
let g:Tlist_Auto_Update=1
let g:Tlist_Process_File_Always=1
let g:Tlist_Exit_OnlyWindow=1
let g:Tlist_Show_One_File=1
let g:Tlist_WinWidth=25
let g:Tlist_Enable_Fold_Column=0
let g:Tlist_Auto_Highlight_Tag=1
" NERDTree.vim
let g:NERDTreeWinPos="right"
let g:NERDTreeWinSize=25
let g:NERDTreeShowLineNumbers=1
let g:NERDTreeQuitOnOpen=1
" cscope.vim
if has("cscope")
set csto=1
set cst
set nocsverb
if filereadable("cscope.out")
cs add cscope.out
endif
set csverb
endif
" OmniCppComplete.vim
set nocp
filetype on
filetype plugin on
let g:OmniCpp_DefaultNamespaces=["std"]
let g:OmniCpp_MayCompleteScope=1
let g:OmniCpp_SelectFirstItem=2
" VimGDB.vim
if has("gdb")
set asm=0
let g:vimgdb_debug_file=""
run macros/gdb_mappings.vim
endif
" LookupFile setting
let g:LookupFile_TagExpr='"./tags.filename"'
let g:LookupFile_MinPatLength=2
let g:LookupFile_PreserveLastPattern=0
let g:LookupFile_PreservePatternHistory=1
let g:LookupFile_AlwaysAcceptFirst=1
let g:LookupFile_AllowNewFiles=0
" Man.vim
source $VIMRUNTIME/ftplugin/man.vim
" snipMate
let g:snips_author="Du Jianfeng"
let g:snips_email="[email protected]"
let g:snips_copyright="SicMicro, Inc"
" plugin shortcuts
function! RunShell(Msg, Shell)
echo a:Msg . '...'
call system(a:Shell)
echon 'done'
endfunction
nmap <leader>sa :cs add cscope.out<cr>
nmap <leader>ss :cs find s <C-R>=expand("" )<cr><cr>
nmap <leader>sg :cs find g <C-R>=expand("" )<cr><cr>
nmap <leader>sc :cs find c <C-R>=expand("" )<cr><cr>
nmap <leader>st :cs find t <C-R>=expand("" )<cr><cr>
nmap <leader>se :cs find e <C-R>=expand("" )<cr><cr>
nmap <leader>sf :cs find f <C-R>=expand("" )<cr><cr>
nmap <leader>si :cs find i <C-R>=expand("" )<cr><cr>
nmap <leader>sd :cs find d <C-R>=expand("" )<cr><cr>
nmap <leader>zz <C-w>o
nmap <leader>gs :GetScripts<cr>
let Tlist_Show_One_File=0
set noswapfile
set tags+=/usr/include/tags
set tags+=./tags
map ta :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q.<CR>
[] #里面的内容都是以单个字符为单位匹配.
* #匹配任意长度字符串. rm *.c 删除所有.c文件
? #匹配任意单个字符
[1-4] #匹配1-4之间的字符. rm demo[1-4].c
[14] #匹配1,4字符
[^123] #匹配除了1,2,3以外的所有字符
| #将一个命令的输出作为另一个命令输入.
基本用法: 命令 .. | 命令 ... 例如: ls /dev | wc -w 可以统计/dev下面文件的总个数
< #输入重定向 用法: wc < file 将file作为输入源 wc 接收来自file内容的输入
> #输出重定向 用法: > file 将file作为新的输出源. 先清空再写入文件
>> #输出重定向 用法: >> file 将file作为新的输出源. 以追加方式写入文件.
&> #错误输出重定向 用法: &> file 将错误信息输出定位到file中
`` #将一个命令的输出作为另一个命令的参数.
ls -l `pwd` #命令1 [选项] `命令2`
#单引号''
echo 'ls ./' #严格按原样输出
var=1;echo '$var' #严格按原样输出,输出 $var
#双引号""
#双引号内则会解析特殊字符,包括'(单引号)、"(双引号)、$(取内容符)、\(转义符),如果要忽略特殊字符,就可以利用\来转义。
echo "ls ./" #输出 ls ./
var=1;echo "$var" #输出 1
var=1;echo "\*\$var$var'$var'"aaa"" #输出 \*$var1'1'aaa
#在""中''会失效
#分号;
1.在配置文件中
任何以";(分号)或#(井号)"开头的行表示一个注释,并被忽略。
通常"#(井号)"表示备注,对于配置文件可能会启用的部分使用;(分号)。
2.在case语句中
;; # 表示退出case语句,相当于C中的break
3.在终端
; #表示一个语句的结束
#斜杠\、/
1.Linux
“/”斜杠表示路径,“\”反斜杠表示转义
2.Windows
“/”斜杠表示参数,“\”反斜杠表示本地路径
#单小括号()
1.初始化数组
array=(a b c d)
2.子Shell赋值
(var=1;echo $var)
3.与”$“结合实现命令替换
echo $(ls -l)
4.命令集合的结果重定向
( echo "a";echo "b" )| awk '{print NR,$0}' #1 a
#2 b
#双小括号(()) 里面的语法和C类似
1.算术运算 #里面有逗号
#省略”$“进行算术运算,同时支持在括号内用“,”对多个表达式进行分割
a=3;b=4;((a++,b--));echo $a $b #5 2
echo $((9*6,6+6)) #输出12
echo ((9*6,6+6)) #会语法错误,有计算结果,但没获取结果
a=2;b=5;((d=a*b,c=a+b));echo $c $d #7 10
2.算术运算 #里面没有逗号
$((4+6)) 、expr 4+6 和$[ 4+6 ]效果相同
3.逻辑运算
(((a<=b||c<a)&&a)) #和c逻辑相同
4.进制转换
cho $((16#100)) #将16进制100转换为10进制256
#单中括号[]
1.逻辑运算
if [ a -eq b ]; #左中括号是调用test的命令标识,右中括号是关闭条件判断
2.作正则表达式的一部分(通配符)
[0-9] #描述一个字符的匹配范围
3.引用数组元素
a={1 2 3 4}; echo ${a[2]} #3
4.在命令简介中
gzip [ -acdfhklLnNrtvV19 ] [-S suffix] [ name ... ] #gzip的命令简介
#[] 里面的选项或参数表示可选,可有可无的意思 可以带上这个参数也可以不要
#双中括号[[ ]]
1.bash的关键字
#检测字符串是否符合某个正则表达式
[[ string =~ regexp ]] #判断右边的模式是否为左边字符串的子字符串
#使用=~操作符时,其右边的字符串被认为是一个扩展正则表达式。扩展之后跟左边字符串进行比较,看左边字符串是否包含指定模式。注意是包含关系,不是完整匹配!
2.
#大括号{}
1.在变量名中
var=1;echo "${var}aa" # 1aa
1.# 特殊的替换结构
${var:-string} # 若变量var为空,则用在命令行中用string来替换
${var:=string} # 在于var为空时,string会赋给var
${var:+string} # 若变量var不为空,替换成string,若var为空时则不替换
${var:?string} # 若变量var不为空,则用变量var的值来替换
2.# 四种模式匹配替换结构
# #是去掉左边(在键盘上#在$之左边)
# %是去掉右边
# #和%中的单一符号是最小匹配,两个相同符号是最大匹配。
# 是否匹配给定的模式pattern结尾
${variable%pattern} # 如果是,把variable中的内容去掉右边最短的匹配模式
${variable%%pattern} # 如果是,就从命令行把variable中的内容去掉右边最长的匹配模式
# 是否匹配给定的模式pattern开始
${variable#pattern} # 如果是,就从命令行把variable中的内容去掉左边最短的匹配模式
${variable##pattern} # 如果是,就从命令行把variable中的内容去掉右边最长的匹配模式
3.# 字符串的提取和替换
${var:num} # shell在var中提取第num个字符到末尾的所有字符
${var:num1:num2} # num1是位置,num2是长度
${var:num1:num2} # 表示将var字符串的第一个匹配的pattern替换为另一个pattern
${var//pattern/pattern} # 表示将var字符串中的所有能匹配的pattern替换为另一个pattern
2.大括号拓展
{1,2,3}.txt、{1..3}.txt #表示1.txt、2.txt、3.txt
3.代码块
fun() #在函数中
{
}
#点.
1.一点 .
cd . # 表示当前目录
a.txt # 表示后缀名
2.两点 ..
cd .. # 表示上一级目录
touch {1..3}.c # 表示创建1.c、2.c、3.c
#and符号&
1.在终端&
gedit .vimrc & #后台运行文本编辑器
#默认情况下,进程是前台进程,这时就把Shell给占据了,我们无法进行其他操作,对于那些没有交互的进程,很多时候,我们希望将其在后台启动,可以在启动参数的时候加一个’&'实现这个目的。
2.在逻辑运算中&& #实现逻辑与的功能
3.&> #错误输出重定向
mkdir aaa #在当前目录下创建aaa目录,相对路径;
mkdir ./bbb #在当前目录下创建bbb目录,相对路径;
mkdir /ccc #在根目录下创建ccc目录,绝对路径;
mkdir {dirA,dirB} # 批量创建测试目录
mkdir folderTwo folderThree folderFour #在当前目录创建三个目录。
mkdir -p folderFive/subFolder #会创建里面没有的目录文件夹
#选项 -p为递归创建
#选项 -v显示创建目录的过程信息
#选项 -m在创建目录的同时设定权限
#选项 -z
mkdir {folderFour,folderThree,folderTwo,folderOne}/subfolder
cp -r /aaa /bbb #将/目录下的aaa目录复制到/bbb目录下,在/bbb目录下的名称为aaa
cp -r /aaa /bbb/aaa #将/目录下的aa目录复制到/bbb目录下,且修改名为aaa;
rm -r /bbb #递归删除、且删除文件夹内的文件,若你非管理员时会询问你是否删除每一个文件
rm -rf /bbb #强制删除/目录下的bbb目录。如果bbb目录中还有子目录,也会被强制删除,不会提示;
rmdir test01 #目录的删除
#改名
mv 原先目录 文件的名称 mv tomcat001 tomcat #mv的功能是将文件重命名或将其移至一个新的目录中
#改位置
mv 目录名称 目录的新位置 mv /usr/tmp/aaa /usr #将usr目录移动到/usr/tmp/aaa下
cd / #切换到根目录
cd /usr #切换到根目录下的usr目录
cd ../ #切换到上一级目录 或者 cd ..
cd ~ #切换到home目录
cd - #切换到上次访问的目录
ls #查看当前目录下的所有目录和文件
ls -a #查看当前目录下的所有目录和文件(包括隐藏的文件)
ls -l #或 ll 列表查看当前目录下的所有目录和文件(列表查看,显示更多信息)
ls -al #查看所有文件的详细信息
ls /dir #查看指定目录下的所有目录和文件 如:ls /usr
find / -name 'b' #查询根目录下(包括子目录),名以b的目录和文件;
find / -name 'b*' #查询根目录下(包括子目录),名以b开头的目录和文件;
#为什么会查找到文件是因为在linux下目录(文件夹)也是一个文件
# 文件类型 lsp-bcd
l # 符号链接文件
s # 套接字文件
p # 管道文件
- # 普通文件
b # 块设备文件
c # 字符设备文件
d # 目录文件
inode包含文件的元信息,具体来说有以下内容:(对于文件来说,每个文件都有一个独立的inode号)
#普通文件
touch dirA/{A1,A2,A3} #dirA创建三个文件dirA/A1,dirA/A2,dirA/A3
#链接文件
ln 文件名 链接文件名 #硬链接
ln -s #软连接
#软连接:快捷方式 文件类型:链接文件 l
1.以绝对路径的方式,去访问文件
2.源文件改名后,无法访问
3.可以跨操作系统,因为用的是路径
#硬链接: 备份 文件类型:普通文件 -
1.以inode号,去访问文件
2.源文件改名后任然可以访问
3.不能跨操作系统(不同的操作系统,分配的inode号可能不同)
rm #命令的功能为删除一个目录中的一个或多个文件或目录
rm ./*.c #删除当前目录下的.C文件
find . -name '*.pyc' -exec rm -rf {} \; #递归删除.pyc格式的文件
#rm
-d或--directory 直接把欲删除的目录的硬连接数据删成0,删除该目录。
-f或--force 强制删除文件或目录,忽略不存在的文件,不提示确认。
-i或--interactive 删除既有文件或目录之前先询问用户。
-I 在删除超过三个文件或者递归删除前要求确认。此选项比-i 提示内容更少,但同样可以阻止大多数错误发生。
-r或-R或--recursive 递归删除,将指定目录下的所有文件及子目录一并删除。
-v或--verbose 显示指令执行过程。
--help 在线帮助。查看该命令功能和可带参数等。
#改名
mv 原先目录 文件的名称 mv tomcat001 tomcat
#改内容
vi 文件名 #使用vi编辑器编辑
gedit 文件名 #使用文本编辑器编辑
#改权限chmod User、Group、Other
chmod +x aaa.txt #表示ugo都有执行权限
# u 表示该档案的拥有者、g 表示与该档案的拥有者属于同一个群体(group)者、o 表示其他以外的人
# a 表示这三者皆是。
# r 表示可读取、w 表示可写入、x 表示可执行
# + 增加权限、- 撤销权限、= 设定某类用户只有该权限(=表示该类用户只有某个权限)
chmod o+rx aaa.txt;chmod o=x aaa.txt #执行该命令后o用户只有执行权限
chmod 0100 aaa.txt #使用8进制赋予权限 必须在最前面加0
#改所属用户chown
#改用户组chgrp
#查看文件内容
cat #看最后一屏 -n 显示行号 -v 用^I显示tab建
more #百分比显示
less #翻页查看
tail #指定行数或者动态查看
#查找文件
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [starting-point...] [expression]
-name 按文件名称查找
-user 按文件拥有者查找
-group 按文件拥有组查找
-type 按文件类型查找
-perm 按文件权限查找
-exec 对查找到的文件执行指定动作
-maxdepth 指定查找范围最大为第几级目录
-mindepth 指定查找范围最小为第几级目录
-cmin 按文件修改时间查找
-size 按文件大小查找
-o / -a / -not 查找条件或/且/非
grep [options] [pattern] file
#命令 选项 匹配模式 文件数据
-V 排除匹配结果
-n 显示匹配行与行号
-i 不区分大小写
-c 只统计匹配行数
-E 使用egrep命令
-o 只输出匹配内容
-w 只输出过滤的单词
-F 不适用正则表达式
-l 列出包含匹配项的文件名
-L 列出不包含匹配项的文件名
grep -i "^h" names.txt # 输出以h开头的行,不区分大小写
#常用正则表达式
#表达式 解释说明
^ # 用于模式最左侧,如 “^yu” 即匹配以yu开头的单词
$ # 用于模式最右侧,如 “yu$” 即匹配以yu结尾的单词
^$ # 组合符,表示空行
. # 匹配任意一个且只有一个字符,不能匹配空行
| # 转义字符
* # 重匹配前一个字符连续出现0次或1次以上
.* # 匹配任意字符
^.* # 组合符,匹配任意多个字符开头的内容
.*$ # 组合符,匹配任意多个字符结尾的内容
[abc] # 匹配 [] 内集合中的任意一个字符,a或b或c,也可以写成 [ac]
[^abc] # 匹配除了 ^后面的任意一个字符,a或b或c,[]内 ^ 表示取反操作
#统计文件
wc [-clw][--help][--version][文件...]
-c # 字节数 或 --bytes或 --chars 只显示Bytes数/字节数。
-m # 统计字符数,不能与-c同时使用
-l # 显示行数 或 --lines 显示行数。
-L # 打印最长长度
-w # 显示字数 或 --words 只显示字数。
--help # 在线帮助
--version # 显示版本信息。
#zip 压缩
-r #递归目录。
-DF #也写作 --dif。只包括有改变的文件或比输入归档较新的文件。
-1~-9 #1是更快地压缩,9是更好地压缩,默认值是6。
-sf #表示查看压缩内的文件
-d #表示删除压缩文件内指定的文件
--out #输出到新的归档。如果输入是拆分的,输出将会默认为相同的拆分大小。
zip zipfile -r . -i "*.h" #递归当前目录并压缩以 .h 为结尾的文件
zip zipfile -FS -r dir # 归档更新
zip -r foofull . -DF --out foonew
#递归当前目录,如果有 foofull 中没有的文件或有改变的文件,就压缩到 foonew 中
#unzip 解压
-f #更新压缩包的文件;
-l #显示压缩文件内的文件;
-v #执行时显示详细的信息(显示压缩率);
-o #不询问用户,覆盖原有文件;
-q #不显示执行过程;
-d #指定文件解压缩后所要存储的目录;
unzip -q -d /zip/ test.zip #-d 后面必须接路径,不然会报错,且当路径不存在时会自动创建
#gzip
gzip #命令只能用来压缩文件,压缩后会删除源文件,不能压缩目录,即便指定了目录,也只能压缩目录内的所有文件。
-d #解开压缩文件
-l #列出压缩文件的相关信息
-r #递归处理,将指定目录下的所有文件及子目录一并处理
-v #显示指令执行过程
-<n> #压缩效率是一个介于1-9的数值,预设值为"6",指定愈大的数值,压缩效率就会愈高
#ungzip/gunzip
#bzip2
#bunzip
#rar
#tar 文件、目录打(解)包
#这五个是独立的命令, 压缩解压都要用到其中一个, 可以和别的命令连用但只能用其中一个
-c #建立压缩档案
-x #解压
-t #查看内容
-r #向压缩归档文件末尾追加文件
-u #更新原压缩包中的文件
#下面的参数是根据需要在压缩或解压档案时可选的。
-z #有gzip属性的
-j #有bz2属性的
-Z #有compress属性的
-v #显示所有过程
-O #将文件解开到标准输出
#下面的参数-f是必须的
-f #使用档案名字, 切记, 这个参数是最后一个参数, 后面只能接档案名。
tar -rf all.tar *.gif #条命令是将所有.gif的文件增加到all.tar的包里面
tar -cvf jpg.tar *.jpg #将目录里所有jpg文件打包成tar.jpg
sudo #让普通用户具有临时使用root权限的权利
lsp ALL=(ALL:ALL) ALL #允许lsp用户以root身份执行各种应用命令,需要输入lsp用户的密码
lsp ALL=NOPASSWD: /bin/ls, /bin/cat #仅允许lsp用户以root身份免密执行ls 、cat命令
su 用户名 #用于用户之间的切换
# root向普通或虚拟用户切换不需要密码,反之普通用户切换到其它任何用户都需要密码验证
su test #切换到test用户,但是路径还是/root目录
su - test #切换到test用户,路径变成了/home/test
su #切换到root用户,但是路径还是原来的路径
su - #切换到root用户,并且路径是/root
exit #退出返回之前的用户
adduser #添加用户指令
deluser #删除用户 (先退出该用户登录状态)
usermod #修改用户信息指令
usermod -d /home/[新名字] -m -l #【新名字】【旧名字】修改用户名(也需要该主目录名称)
sudo usermod -d /home/yh2 -m -l yh2 yh
usermod -g [grname] [username] #修改从属的组:
usermod -s /bin/sh yh #修改bash路径:
passwd [用户] #修改用户密码
vi /etc/sudoers或者visudo #进入sudo配置文件命令,可以提升用户权限为root
vi /etc/passwd #存放了系统下所有用户的信息.
vi /etc/group #查看用户组.
vi /etc/skel #每一次创建新用户,都会将该目录下的内容拷贝到新用户的主目录下.
#通俗来讲,进程就是一个正在执行的程序。在这里我们理解为进程由进程控制块PCB、数据和代码构成。
ps aux #显示信息如下:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
进程所属人 #| | | | | |
进程id#| | | | |
cpu使用量 #| | |
内存使用量 #| |
虚拟内存的大小 #|
常驻内存的使用大小
进程使用到的终端
进程状态
进程运行时长
进程占用cpu时长
进程名称
R 运行状态 #进程不一定在运行,表明进程要么在运行中,要么在运行队列里。
S 睡眠状态 #可中断睡眠,进程在等待事件完成,此时进程处于等待队列。
D 磁盘休眠状态 #不可中断睡眠状态,在这个状态的进程通常会等待IO的结束。
T 停止状态 #发送 SIGSTOP 信号停止进程。发送 SIGCONT 信号让进程继续运行。
X 死亡状态 #这个状态只是一个返回状态,你不会在任务列表里看到这个状态。
Z-僵尸进程 #僵尸进程会以终止状态保持在进程表中,并且一直等待父进程读取退出状态代码
孤儿进程 #父进程如果提前退出,子进程就会成为孤儿进程,孤儿进程会被1号init进程领养。
僵尸状态 #是一个比较特殊的状态,当进程退出并且父进程没用读取到子进程的退出码时,就会产生僵尸状态。一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。
< #(高优先级)
N #(低优先级)
s #(父进程)
+ #(前台进程)
PRI #代表这个进程可被执行的优先级,其值越小越好,默认值都是80
NI #代表这个进程的NICE值,用户通过调整NICE值修改进程的优先级,而NICE的取值范围为(-20~19)
ps -aux #以用户为主,显示当前用户在当前终端的所有进程
ps -elf #以完整的长格式显示系统内所有进程
top #以全屏交互式的界面显示进程,每三秒刷新一次
top -c #显示完整的命令路径
top -d #<时间> 设置间隔时间
top -u #<用户名> 指定用户名
top -p #<进程号> 指定进程
top -n #<次数> 循环显示的次数
top -d 1 -c -p 12 #每隔1秒显示pid是12的进程的资源使用情况,并显示该进程启动的命令行参数
#在top基本视图,按
f #编辑基本视图中的显示字段
c #显示进程的路径
k #不退出top命令的情况下杀死某个正在运行的进程
b #高亮显示当前正在运行的进程
1 #监控每个逻辑CPU的状况
#第一行:显示任务队列信息
系统当前时间:top - 09:15:52
系统运行时间:up 0 min
当前登录用户:1 user
负载均衡情况:后面的三个数分别是1分钟、5分钟、15分钟的负载情况
#第二行:Tasks — 任务(进程)
总进程:95 total
运行进程:1 running
休眠进程:94 sleeping
停止进程:0 stopped
僵尸进程:0 zombie
#第三行:cpu状态信息
0.3 us:用户空间占用CPU的百分比。
0.0 sy:内核空间占用CPU的百分比。
0.0 ni:改变过优先级的进程占用CPU的百分比
99.7 id:空闲CPU百分比
0.0 wa:IO等待占用CPU的百分比
0.0 hi:硬中断占用CPU的百分比
0.0 si:软中断占用CPU的百分比
0.0 st:当Linux系统是在虚拟机中运行时,等待CPU资源的时间占比
#第四行:内存状态
total:总内存量(4G)
free:空闲内存(2G)
used:已用内存(1G)
buff/cache:缓存内存(307M)
#第五行:swap交换分区信息
total:总内存量(839M)
free:空闲内存(839M)
used:已用内存(0)
avail Mem:可用内存(2G)
#第六行:各进程状态监控
pstree -aup #以树状图的方式展现进程之间的派生关系,显示效果比较直观
#清理普通进程
1.通过进程ID
ps -ef|grep firefox #查找进程ID
kill -9 <PID> #强制终止
2.通过程序名称
killall firefox #杀死进程
pkill firefox #杀死所有进程
3.通过点击
xkill #会出现一个白色的x, 然后用鼠标单击想要杀死的应用
4.通过system monitor(系统监视器)
gnome-system-monitor #打开系统监视器
#kill命令
kill -STOP [pid] #发送SIGSTOP (17,19,23)停止一个进程,而并不消灭这个进程。
kill -CONT [pid] #发送SIGCONT (19,18,25)重新开始一个停止的进程。
kill -KILL [pid] #发送SIGKILL (9)强迫进程立即停止,并且不实施清理操作。
kill -9 -1 #终止你拥有的全部进程。
#清理僵尸进程
#为什么要清理僵尸进程:僵尸进程一般指进程已经死了或者已经停止运行了,但是它仍存在与进程列表中,依然占用着系统资源。
1.查找僵尸进程
ps aux | egrep "Z|defunct"
2.获取父进程id
ps -o ppid= <Child PID>
3.通过父进程杀死子进程
kill -s SIGCHLD <Parernt PID>
4.父进程无法清理子进程,直接杀父
kill -9 <Parernt PID> #kill -9 来强制终止退出
# IP地址
公有ip # 由InterNIC负责,通过它直接访问因特网
私有ip # 专门为组织机构内部使用
#不写了,这部分内容很多
A.编译性语言
1.需要通过编译器,且有编译过程(编译器会优化语法)
2.执行效率高
3.程序语法错误时不会执行
B.解释性语言
1.通过对应解释器,才可执行
2.执行效率低
3.解释器无法检查语法错误,并且会执行有错误的语句(但会在错误处打印发生错误的提示信息)
4.可以在不同操作系统上执行.
a=0 #定义了变量a且赋值为0了
#定义变量的同时赋值 unset表示取消变量赋值
#赋值等号两边不能有空格
#变量没有数据类型的说法,所有变量都会被解释为字符串.
#变量名遵循C语言标识符的定义(不能和shell关键字重名)
#引用变量里的内容,需要添加 $ 来引用 例如: $A
echo '$path' #严格按原样输出
echo "$path" #输出变量path的内容 #同:echo $path
echo "${a}bc" #打印变量a的内容后连着打印bc
#变量引用是从 $0 开始依次往后引用, $0......$n
ls -A ./*.c #第0个参数是ls,一般情况下从第一个参数开始使用
#如果参数大于9个,对于9后面的引用 需要加{ } 例如: ${10}
#被shell解释器提前定义好(预定义)的变量,这些变量都已经被赋予了特殊的意义,不能修改,且可以直接使用.
$*:表示所有命令行参数,不包含 $0
$#:表示所有命令行参数的总个数,不包含 $0
$?:表示上一次命令执行后的返回状态.正常表示为0。
$@:表示所有命令行参数,不包含 $0
$$:显示正在执行程序的进程ID
env #查看所有环境变量
export #添加环境变量
# #表示单行注释
#多行注释
!<<:
语句
:
#解开多行注释
!>>:
语句
:
#表示接收终端输入的内容,如果终端没有输入,则会阻塞等待
read -p: #添加提示内容 例如: read -p "input:" a b
read var1 var2 var3.... #需要从终端输入三个变量,以空格分隔
read var1 var2 var3 #第一个存入var1,第二个存入var2,后面所有的都会存入 var3!
#整数四则运算 (+、-、*、 /、 %)
#expr 该命令有结果
expr $A + 3 - 5 \* 4
#乘法符号与通配符冲突所以需要添加 \ 2 \* 3
sum=`expr 4 / 2`
#在shell脚本中需要使用 命令置换 来获取计算的结果
#$[$a+$b] #该命令表示的是取变量的内容,单独放出来会报错,可以使用 echo $[2**8] 来打印该信息
$[4+5] #表示4+5 在这个括号里面不需要加空格
$[2**8] #表示2的8次方
test #针对的对象: 字符串、整数、文件属性
#通常使用 $?(查看上一条指令执行的返回状态) 来常看测试返回值,因为该语句没有输出结果
test 表达式1 –a 表达式2 #两个表达式都为真
test 表达式1 –o 表达式2 #只有一个为真
[ ] #方括号两边的里面都必须有空格
[ $a = $b ] #里面的等号两边必须有空格
(()) #类似C的语法,在C中不能完成的判断在这个括号里面也不能完成
(( a<=b && c>=a )) #在(())里面引用可以不加 $ 符号
#常用判断命令选项
#对表达式
表达式1 –a 表达式2 #都为真
表达式1 –o 表达式2 #只有一个为真
#对整数的判断
a –eq b #a与b是否相等 –eq
a -ne b #不等于
a -ge b #大于等于
a -gt b #大于
a -le b #小于等于
a -lt b #小于
#对字符的判断
str1 = str2 #str1是否与str2相同(str1、str2是字符串)
str1 != str2 #str1是否与str2不同
str1 < str2 #str1是否小于str2
str1 > str2 #str1是否大于str2
-n str #判断str长度是否非零
-z str #str长度是否为0
#对文件属性
-d file #判断file是否为目录
-e file #判断file是否存在
-f file #检查file是否为文件
-r file #判断文件是否可读
-s file #判断file是否存在并非空
-w file #判断file是可写
-x file #判断file是可执行
#if else
if 条件语句
then
语句块
else
语句块
fi
#if elif elif
if 条件语句
then
语句块 #then 后面才是语句块
elif 条件语句
then
语句块
elif 条件语句
then
语句块
else
语句块 #else后面不需要then
fi #以fi结尾
case $var in #var是字符串变量
模式1) # 如果是多个模式匹配 则可是使用 | 来连接 yes | YES | Y)
语句1
;; # ;; 表示 退出case语句
模式2)
语句2
;;
*)
语句3
;; # 最后可以不需要加 ;;
esac
# 带列表 for..in..do..done
for varible1 in {1..5} # for file in $( ls )
do
echo "Hello, Welcome $varible1 times "
done
for i in {1..100..2}
do
let "sum+=i"
done
# 不带列表for循环
for argument # argument 相当于所有命令行参数的列表
do
echo "$argument"
done
do
echo "$argument"
done
# C风格的for
for((integer = 1; integer <= 5; integer++))
do
echo "$integer"
done
#死循环
while :;
do
echo hello,word!
done
# 一般用法
while(( $int<=5 ))
do
echo $int
done
#下文更新
2022.11.14 不用更新了
找到一篇非常详细的文章: