Linux基础

Linux

一、了解嵌入式系统

简单理解:将软件嵌入到硬件当中,使其变得智能

嵌入式系统(官方): 嵌入式系统是以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统

1. 嵌入式设备

鼠标,键盘,交换机,路由器,智能手表,智能洗衣机,手机

2. 嵌入式系统

一个程序,管理计算机上的软硬件资源
嵌入式系统功耗低,体积小,专用性强。

特点

1)可裁剪性。支持开放性和可伸缩性的体系结构。

2)强实时性。EOS实时性一般较强,可用于各种设备控制中。

3)统一的接口。提供设备统一的驱动接口。

4)操作方便、简单、提供友好的图形GUI和图形界面,追求易学易用。

5)强稳定性,弱交互性。嵌入式系统一旦开始运行就不需要用户过多的干预、这就要负责系统管理的EOS具有较强的稳定性。嵌入式操作系统的用户接口一般不提供操作命令,它通过系统的调用命令向用户程序提供服务。

6)固化代码。在嵌入式系统中,嵌入式操作系统和应用软件被固化在嵌入式系统计算机的ROM中。

7)良好的移植性更,也就是好的硬件适应性。

3. Linux操作系统

1.开源免费
2.内核可裁剪,内核小 - 2G
3.移植性比较好
4.安全性高
Linux系统结构
Linux内核:
    1.文件管理
    2.内存管理
    3.网络管理
    4.设备管理
    5.进程管理
shell:被称为命令行解释器,可以看作是一种程序软件. shell提供了应用于操作系统交互的功能,实
现对操作系统的保护...(作用:解释shell命令 例如:ls、cd....)
应用程序:操作系统上基础的一些应用,这些应用一般会和操作系统一起被安装.
    图形用户界面(GUI)——X window、KDE、GNOME
    管理程序(控制中心):设置桌面系统的外观、功能、行为、感觉等
    应用程序:Linux中可以安装的应用程序举不胜举。Openoffice、firefox、Gaim、XPlay等等
    编程工具: 包括用来创建专业接口的应用程序和库的编程应用程序GCC,java Elcalisp

4.Linux的系统目录

├── 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 # 存放内容易变的文件的目录

二、vim编辑器

1.什么是vi/vim

#vi是Visual Interface的缩写,即可视化接口
#vim是Visual Improve的缩写,即vi的增强版(具有语法着色功能)
#基本上vi可以分为三种状态,分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode)

2.三种模式

1)命令模式
  • 移动光标
#逐字符移动
     k				↑
    h		l	   ←		→
     j				↓
#h:移动#个字符
#以单词为单位移动
w	#移到下一个单词的词首
e	#跳至当前或下一个单词的词尾
b	#跳至当前或上一个单词的词首
nw	#表示移动n个单词
#行内(当前行)跳转
0	#绝对行首
^	#行首第一个非空白字符
$	#绝对行尾
#行间跳转
nG		#跳转到第n行
G		#最后一行
#翻页
Ctrl+f		#向下翻一屏
Ctrl+b		#向上翻一屏
Ctrl+d		#向下翻半屏
Ctrl+u		#向上翻半屏
  • 删除d
#删除单个字符
x		#删除光标所在字符
nx		#删除光标所在的n个字符
#删除命令 d
#使用方法1:删除命令加移动命令组合使用,例如
ndw		 #删除光标到其后n个单词词首的所有字符
#使用方法2:dd
dd		#删除光标所在行
ndd		#删除光标所在后的n行(包含光标所在行)
  • 复制y
#复制命令y
#使用方法1:删除命令加移动命令组合使用,例如
nyw		 #复制光标到其后n个单词词首的所有字符
#使用方法2:dd
yy		#复制光标所在行
nyy		#复制光标所在后的n行(包含光标所在行)
  • 粘贴p
#粘贴命令p/P
p(小写p)
#如果删除的或复制的为整行内容,则粘贴到光标所在行的下方,如果复制或删除的内容为非整行,则粘贴至光标所在字符的后面
P(大写P)
#如果删除的或复制的为整行内容,则粘贴到光标所在行的上方,如果复制或删除的内容为非整行,则粘贴至光标所在字符的前面
  • 替换r
r	#单字符替换,会替换光标选中字符
R	#替换模式,可以做字符替换。
  • 撤销u
#撤销命令u
u		#撤销前一次编辑操作
nu		#直接撤销n次操作

Ctrl+r	#撤销最近一次撤销操作
  • 可视化模式v/V
#在命令模式下按v: 
v(小写)		#按字符选取,键盘控制光标 划过 的区域被选取
V(大写)		#按矩形选取,键盘控制光标划过的行被选取
  • 重复上次操作
. 	#上一次dd删除了一行,现在输入.就可以重复dd删除行的操作
2)底行模式
  • 位置符号
.		#表示当前行
$		#表示最后一行
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		#退出所有
  • shell交互
! 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			#关闭语法高亮显示
3)插入模式
#如何进入
a	#在光标后插入
i	#在光标所在位置插入
o	#在光标所在位置的下一行插入
#在插入模式下可以进行输入字符

3.用vi/vim打开文件

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(右) 也可以切换窗口

4.安装vi/配置vi

全局vim配置文件:/etc/vimrc
个人vim配置文件:~/.vimrc
sudo apt-get install vim	#安装vim
"Keyboard COMMANDS: {{{1
nmap  <F2> gg=G
nmap  <F3> :TlistToggle<cr>
"nmap  <F6> :NERDTreeToggle<cr>
nmap  <F4> :MRU<cr>
"nmap  <F5> <Plug>LookupFile<cr>
"nmap  <F9> :call RunShell("Generate tags", "ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .")<cr>
"nmap <F10> :call HLUDSync()<cr>
"nmap <F11> :call RunShell("Generate filename tags", "~/.vim/shell/genfiletags.sh")<cr>
"nmap <F12> :call RunShell("Generate cscope", "cscope -Rb")<cr>:cs add cscope.out<cr>

"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 "\<Right>"
	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 <buffer> <leader><space> :w<cr>:make<cr>
" 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 <space> :
vnoremap <space> :
" 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 <silent> <leader>cd :exe 'cd ' . OpenDir<cr>:pwd<cr>
 
" 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="cmdxiaoha@163.com"
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("<cword>")<cr><cr>
nmap <leader>sg :cs find g <C-R>=expand("<cword>")<cr><cr>
nmap <leader>sc :cs find c <C-R>=expand("<cword>")<cr><cr>
nmap <leader>st :cs find t <C-R>=expand("<cword>")<cr><cr>
nmap <leader>se :cs find e <C-R>=expand("<cword>")<cr><cr>
nmap <leader>sf :cs find f <C-R>=expand("<cfile>")<cr><cr>
nmap <leader>si :cs find i <C-R>=expand("<cfile>")<cr><cr>
nmap <leader>sd :cs find d <C-R>=expand("<cword>")<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 <jeffy.du@gmail.com>
"    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         : daylong00@126.com")
		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         : daylong00@126.com")
		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         : daylong00@126.com")
		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 <iostream>")
		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 <iostream>")
		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 <stdio.h>")
		call append(line(".")+8, "#include <string.h>")
		call append(line(".")+9, "#include <stdlib.h>")
		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  <F2> gg=G
nmap  <F3> :TlistToggle<cr>
"nmap  <F6> :NERDTreeToggle<cr>
nmap  <F4> :MRU<cr>
"nmap  <F5> <Plug>LookupFile<cr>
"nmap  <F9> :call RunShell("Generate tags", "ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .")<cr>
"nmap <F10> :call HLUDSync()<cr>
"nmap <F11> :call RunShell("Generate filename tags", "~/.vim/shell/genfiletags.sh")<cr>
"nmap <F12> :call RunShell("Generate cscope", "cscope -Rb")<cr>:cs add cscope.out<cr>

"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 "\<Right>"
	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 <space> :
vnoremap <space> :
" 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 <silent> <leader>cd :exe 'cd ' . OpenDir<cr>:pwd<cr>

" 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="cmdxiaoha@163.com"
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("<cword>")<cr><cr>
nmap <leader>sg :cs find g <C-R>=expand("<cword>")<cr><cr>
nmap <leader>sc :cs find c <C-R>=expand("<cword>")<cr><cr>
nmap <leader>st :cs find t <C-R>=expand("<cword>")<cr><cr>
nmap <leader>se :cs find e <C-R>=expand("<cword>")<cr><cr>
nmap <leader>sf :cs find f <C-R>=expand("<cfile>")<cr><cr>
nmap <leader>si :cs find i <C-R>=expand("<cfile>")<cr><cr>
nmap <leader>sd :cs find d <C-R>=expand("<cword>")<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>

三、Shell特殊字符

1.通配符

[]		#里面的内容都是以单个字符为单位匹配.
*		#匹配任意长度字符串. rm *.c 删除所有.c文件
?		#匹配任意单个字符

[1-4]	#匹配1-4之间的字符. rm demo[1-4].c 
[14]	#匹配1,4字符 
[^123]	#匹配除了1,2,3以外的所有字符

2.管道

|	#将一个命令的输出作为另一个命令输入.
基本用法: 命令 .. | 命令 ... 例如: ls /dev | wc -w 可以统计/dev下面文件的总个数

3.输入/输出重定向

<		#输入重定向 用法: wc < file 将file作为输入源 wc 接收来自file内容的输入
>		#输出重定向 用法: > file 将file作为新的输出源. 先清空再写入文件

>>		#输出重定向 用法: >> file 将file作为新的输出源. 以追加方式写入文件.
&>		#错误输出重定向 用法: &> file 将错误信息输出定位到file中

4.命令置换

``		#将一个命令的输出作为另一个命令的参数.
ls -l `pwd` 	#命令1 [选项] `命令2` 

5.其他符号

#单引号''
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.&>		   		#错误输出重定向

四、Shell命令

1.目录操作


A)增
1)mkdir
  1. 在当前目录新建一个/多个文件夹
mkdir aaa		#在当前目录下创建aaa目录,相对路径;
mkdir ./bbb		#在当前目录下创建bbb目录,相对路径;
mkdir /ccc		#在根目录下创建ccc目录,绝对路径;

mkdir {dirA,dirB}  # 批量创建测试目录
mkdir folderTwo folderThree folderFour #在当前目录创建三个目录。
  1. 新建多级目录
mkdir -p folderFive/subFolder	  #会创建里面没有的目录文件夹

#选项 -p为递归创建
#选项 -v显示创建目录的过程信息
#选项 -m在创建目录的同时设定权限
#选项 -z
  1. 在多个文件夹下新建子文件夹
mkdir {folderFour,folderThree,folderTwo,folderOne}/subfolder
2) cp -r (递归复制)(且复制文件夹内的文件)
cp -r /aaa /bbb			#将/目录下的aaa目录复制到/bbb目录下,在/bbb目录下的名称为aaa
cp -r /aaa /bbb/aaa		#将/目录下的aa目录复制到/bbb目录下,且修改名为aaa;
B)删
rm -r /bbb			#递归删除、且删除文件夹内的文件,若你非管理员时会询问你是否删除每一个文件
rm -rf /bbb			#强制删除/目录下的bbb目录。如果bbb目录中还有子目录,也会被强制删除,不会提示;
rmdir test01		#目录的删除
C)改
#改名
mv 原先目录 文件的名称   mv tomcat001 tomcat 		#mv的功能是将文件重命名或将其移至一个新的目录中
#改位置
mv 目录名称 目录的新位置	mv /usr/tmp/aaa /usr	   #将usr目录移动到/usr/tmp/aaa下
D)查
1)cd
cd /        	#切换到根目录
cd /usr        	#切换到根目录下的usr目录
cd ../        	#切换到上一级目录 或者  cd ..
cd ~        	#切换到home目录
cd -        	#切换到上次访问的目录
2)ls
ls              #查看当前目录下的所有目录和文件
ls -a			#查看当前目录下的所有目录和文件(包括隐藏的文件)
ls -l 			#或 ll       列表查看当前目录下的所有目录和文件(列表查看,显示更多信息)
ls -al			#查看所有文件的详细信息
ls /dir         #查看指定目录下的所有目录和文件   如:ls /usr
3)find
find / -name 'b'		#查询根目录下(包括子目录),名以b的目录和文件;
find / -name 'b*'		#查询根目录下(包括子目录),名以b开头的目录和文件; 
#为什么会查找到文件是因为在linux下目录(文件夹)也是一个文件

2.文件操作


A)文件基础
# 文件类型 lsp-bcd
l    # 符号链接文件
s    # 套接字文件
p    # 管道文件
-    # 普通文件
b	 # 块设备文件
c    # 字符设备文件
d    # 目录文件

inode包含文件的元信息,具体来说有以下内容:(对于文件来说,每个文件都有一个独立的inode号)

  • 文件的字节数
  • 文件拥有者的User ID
  • 文件的Group ID
  • 文件的读、写、执行权限
  • 文件的时间戳,共有三个:
  • ctime指inode上一次变动的时间
  • mtime指文件内容上一次变动的时间
  • atime指文件上一次打开的时间
  • 链接数,即有多少文件名指向这个inode
  • 文件数据block的位置
B)增
#普通文件
touch dirA/{A1,A2,A3}     #dirA创建三个文件dirA/A1,dirA/A2,dirA/A3
#链接文件
ln 文件名 链接文件名			#硬链接
ln -s						 #软连接

#软连接:快捷方式	文件类型:链接文件 l
1.以绝对路径的方式,去访问文件
2.源文件改名后,无法访问
3.可以跨操作系统,因为用的是路径

#硬链接: 备份	  文件类型:普通文件 -
1.以inode号,去访问文件
2.源文件改名后任然可以访问
3.不能跨操作系统(不同的操作系统,分配的inode号可能不同)
C)删
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   在线帮助。查看该命令功能和可带参数等。

D)改
  1. 改名
#改名
mv 原先目录 文件的名称   mv tomcat001 tomcat
  1. 改内容
#改内容
vi 文件名		#使用vi编辑器编辑
gedit 文件名	#使用文本编辑器编辑
  1. 改权限
#改权限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
E)查
#查看文件内容
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 # 显示版本信息。

3.归档打包

A)压缩解压
#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
B)归档
#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

4.用户管理

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		#退出返回之前的用户
A)增
adduser  	#添加用户指令
B)删
deluser		#删除用户 (先退出该用户登录状态)
C)改
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 [用户]		#修改用户密码
D)查
vi /etc/sudoers或者visudo	#进入sudo配置文件命令,可以提升用户权限为root
vi /etc/passwd 			 #存放了系统下所有用户的信息.
vi /etc/group 			 #查看用户组.
vi /etc/skel			 #每一次创建新用户,都会将该目录下的内容拷贝到新用户的主目录下.

5.进程管理

#通俗来讲,进程就是一个正在执行的程序。在这里我们理解为进程由进程控制块PCB、数据和代码构成。

ps aux #显示信息如下:

USER         PID %CPU %MEM    VSZ   RSS 	TTY      STAT 	START   TIME 	COMMAND
进程所属人	  #|	|   |		|	  |		  |
			 进程id#|	  |		  |		|		|
            	 cpu使用量		#|	   |	   |
            		  内存使用量		  #|	 |
            				 虚拟内存的大小   #|
            				 		常驻内存的使用大小
            								进程使用到的终端
                                            		 进程状态
                                            		 		进程运行时长
                                            		 				进程占用cpu时长
                                            		 						进程名称
A)进程状态
R 运行状态			#进程不一定在运行,表明进程要么在运行中,要么在运行队列里。
S 睡眠状态			#可中断睡眠,进程在等待事件完成,此时进程处于等待队列。
D 磁盘休眠状态	   #不可中断睡眠状态,在这个状态的进程通常会等待IO的结束。
T 停止状态			#发送 SIGSTOP 信号停止进程。发送 SIGCONT 信号让进程继续运行。
X 死亡状态			#这个状态只是一个返回状态,你不会在任务列表里看到这个状态。
Z-僵尸进程			#僵尸进程会以终止状态保持在进程表中,并且一直等待父进程读取退出状态代码
孤儿进程			#父进程如果提前退出,子进程就会成为孤儿进程,孤儿进程会被1号init进程领养。
僵尸状态			#是一个比较特殊的状态,当进程退出并且父进程没用读取到子进程的退出码时,就会产生僵尸状态。一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。
<	#(高优先级)
N	#(低优先级)
s	#(父进程)
+	#(前台进程)
B)进程优先级
PRI		#代表这个进程可被执行的优先级,其值越小越好,默认值都是80
NI		#代表这个进程的NICE值,用户通过调整NICE值修改进程的优先级,而NICE的取值范围为(-20~19)

C)查看进程
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		#以树状图的方式展现进程之间的派生关系,显示效果比较直观
D)清理进程
#清理普通进程
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 来强制终止退出

6.网络管理

A)基础知识
# IP地址
公有ip	# 由InterNIC负责,通过它直接访问因特网
私有ip	# 专门为组织机构内部使用
#不写了,这部分内容很多

五、Shell脚本

1. 什么是Shell脚本

  • shell命令的有序集合,就可以称为shell脚本文件. 脚本执行,shell命令批量执行的过程
  • shell脚本也可以被看作是一门语言,shell脚本是一种解释型语言 (需要借助shell解释器)
A.编译性语言
	1.需要通过编译器,且有编译过程(编译器会优化语法)
	2.执行效率高
	3.程序语法错误时不会执行
B.解释性语言
	1.通过对应解释器,才可执行
	2.执行效率低
	3.解释器无法检查语法错误,并且会执行有错误的语句(但会在错误处打印发生错误的提示信息)
	4.可以在不同操作系统上执行.

2. 编程流程


  1. 编写程序
    • 表示注释
    • #!/bin/bash 表示该段程序使用bash解释
  2. 赋予权限(非必须)
  3. 执行程序
    • 直接./*.sh(有权限且在当前目录时)
    • 使用bash或sh +文件名(权限时)
    • 用指令source #source /home/test.sh
  4. 添加到环境变量(非必须)

3. Shell变量


  1. 变量的定义(用户自定义变量)
a=0  #定义了变量a且赋值为0了
#定义变量的同时赋值 unset表示取消变量赋值
#赋值等号两边不能有空格
#变量没有数据类型的说法,所有变量都会被解释为字符串.
#变量名遵循C语言标识符的定义(不能和shell关键字重名)
  1. 变量的引用
  • 变量
#引用变量里的内容,需要添加 $ 来引用 例如: $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 		#添加环境变量

4. Shell语句


1) 说明性语句
#  #表示单行注释
#多行注释
!<<:
	语句
:
#解开多行注释
!>>:
	语句
:
2) 功能性语句
  • 输入输出类语句
#表示接收终端输入的内容,如果终端没有输入,则会阻塞等待
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次方
  • 测试判断语句(真返回0、假返回1)
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是可执行
3) 控制性语句
  • if语句
#if else
if 条件语句
then
	语句块
else
	语句块
fi
#if elif elif 
if 条件语句
then
	语句块		#then 后面才是语句块
elif 条件语句
then
	语句块
elif 条件语句
then
	语句块
else
	语句块		#else后面不需要then
fi			  #以fi结尾
  • case … esac
case $var in	 #var是字符串变量
	模式1)		# 如果是多个模式匹配 则可是使用 | 来连接 yes | YES | Y)
		语句1
		;; 		 # ;; 表示 退出case语句
	模式2)
		语句2
		;;
	*)
		语句3
		;; 		 # 最后可以不需要加 ;;
esac
  • for…do…done
# 带列表		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…done
#死循环
while :; 
do
	echo hello,word!
done

# 一般用法
while(( $int<=5 ))
do
	echo $int
done

六、make工具

#下文更新

2022.11.14 不用更新了
找到一篇非常详细的文章:

Makefile教程


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值