vim 编程环境配置:
.vimrc 文件配置如下:(.vimrc文件放到家目录下:/root ;然后退出 xshell 再登陆进来xshell)
set nocompatible set history=100 filetype on filetype plugin on filetype indent on set autoread set mouse=c syntax enable set cursorline hi cursorline guibg=#00ff00 hi CursorColumn guibg=#00ff00 set foldenable set foldmethod=manual set foldcolumn=0 setlocal foldlevel=3 set foldclose=all nnoremap <space> @=((foldclosed(line('.')) < 0) ? 'zc' : 'zo')<CR> set expandtab set tabstop=4 set shiftwidth=4 set softtabstop=4 set smarttab set ai set si set wrap set sw=4 set wildmenu set ruler set cmdheight=1 set lz set backspace=eol,start,indent set whichwrap+=<,>,h,l set magic set noerrorbells set novisualbell set showmatch set mat=4 set hlsearch set ignorecase set encoding=utf-8 set fileencodings=utf-8 set termencoding=utf-8 set smartindent set cin set showmatch set guioptions-=T set guioptions-=m set vb t_vb= set laststatus=4 set pastetoggle=<F9> set background=dark highlight Search ctermbg=black ctermfg=white guifg=white guibg=black autocmd BufNewFile *.py,*.cc,*.sh,*.java exec ":call SetTitle()" func SetTitle() if expand("%:e") == 'sh' call setline(1, "#!/bin/bash") call setline(2, "##############################################################") call setline(3, "# File Name: ".expand("%")) call setline(4, "# Version: V1.0") call setline(5, "# Author: neo") # 作者 call setline(6, "# Organization: anonymous") # 公司名 call setline(7, "# Created Time : ".strftime("%F %T")) call setline(8, "# Description:") call setline(9, "##############################################################") endif endfunc
if结构条件句:
# 1、单分支if条件句语法: if 条件表达式 then 指令 fi # 2、双分支if条件句语法: if 条件表达式 then 指令 else 指令 fi # 3、多分支if条件句语法: if 条件表达式1 then 指令1 elif 条件表达式2 then 指令2 else 指令3 fi # if条件单分支与条件测试编程对比实践: # 例1:如果不存在 /backup 目录就创建 #!/bin/bash path="/backup" [ -d $path ] || mkdir /backup -p if [ -d $path ] then : # shell 中 , : 表示什么都不做 else mkdir $path -p fi [ ! -d $path ] && mkdir $path -p if [ ! -d $path ] then mkdir $path -p fi # 例2:开发shell脚本判断系统剩余内存的大小,如果低于 100MB 就提示内存不足,否则提示内存充足 # 分析: 1)提取系统内存 2) if进行判断 # 获取内存的命令: free -m [root@m01 ~]# free -m total used free shared buffers cached Mem: 474 214 259 0 78 33 -/+ buffers/cache: 102 371 Swap: 767 0 767 [root@m01 ~]# # linux默认把剩余的内存都当作 buffers/cache 对待,所以上面的 371 就表示剩余的内存(单位是 MB) # 取出 剩余内存371的方法如下: [root@m01 ~]# free -m|awk 'NR==3{print $4}' 371 [root@m01 ~]# free -m|awk 'NR==3{print $NF}' # $NF 表示的最后一个Field(列),即输出最后一个字段的内容 371 # 例题2的示例: [root@m01 practice]# cat get_memory_size.sh #!/bin/bash ############################################################## # File Name: get_memory_size.sh # Version: V1.0 # Author: neo # Organization: anonymous # Created Time : 2019-06-27 23:38:55 # Description: ############################################################## mem=`free -m|awk 'NR==3{print $NF}'` if [ $mem -lt 100 ] then echo "memory insufficient" else echo "memory is sufficient" fi [root@m01 practice]# bash get_memory_size.sh memory is sufficient # 注意: read 读入没办法用 $#
函数:
函数的概念与作用:
函数的作用就是将程序里多次被调用的相同代码组合起来(函数体),并为其取个名字(即函数名),其它所有想重复调用这部分代码的地方都只 需要调用这个名字就可以了。当需要修改这部分重复代码时,也只需要改变函数体内的一部分代码即可实现所有调用的修改,也可以把函数独立写 到文件里,当需要调用函数时,再加载进来使用。 # shell函数的优势: 1. 把相同的程序段定义成函数,可以减少整个程序的代码量,提升开发效率 2. 增加程序的可读、易读性,提升管理效率 3. 可以实现程序功能模块化,使得程序具备通用性(可移植性) # 对于shell来说,Linux系统里面的近2000个命令都可以说是shell的函数
函数的语法:
# 语法1: function 函数名(){ 指令集 return 返回值 } # 语法2: function 函数名 { # 这种定义方式时, 函数名 和 { 之间必须要有一个空格 指令集 return 返回值 } # 语法3:(推荐) 函数名(){ 指令集 return 返回值 }
shell函数的执行:
带参数的函数的执行:
注意: 上图中的第3条表示,$0 依然是脚本的名字,而不是函数所在脚本的名字
局部变量 和 函数的返回值
[root@m01 func]# cat func_04.sh #!/bin/bash ############################################################## # File Name: func_04.sh # Version: V1.0 # Author: neo # Organization: anonymous # Created Time : 2019-06-28 10:25:16 # Description: ############################################################## function func01(){ local i="local neo" # local 变量名 ---> 定义局部变量,该变量只能在函数内部使用 echo "I am $i" return 120 # 函数的返回值 } echo "local var val:$i" # 局部变量在函数外部不能被调用 func01 [root@m01 func]# sh func_04.sh local var val: I am local neo [root@m01 func]# echo $? # exit [<n>] 状态码n可以不指定,默认是上一条命令的退出状态码。 120 [root@m01 func]# # 在函数内的变量最好加上 local ,即把函数内的变量定义成 局部变量,避免变量冲突
监控网站URL是否正常的常见方法
# 方法1、 wget 命令: --spider # 模拟爬虫 -q # 安静访问 -o /dev/null # 不输出 -T # --timeout 超时时间 -t # --tries 重试次数 [root@m01 func]# wget --spider -T 5 -q -o /dev/null -t 2 www.baidu.com [root@m01 func]# echo $? # 通过 echo $? 检测 wget 的URL是否正常 0 [root@m01 func]# # 方法2、 curl 命令: -I # 看响应头 -s # 安静访问 -o /dev/null # 不输出 -w %{http_code} # 返回状态码;200为正常 -m01 # 超时时间 [root@m01 func]# curl www.baidu.com -s &>/dev/null [root@m01 func]# echo $? # 也是通过查看 curl 的执行结果来判断 URL 是否正常 0 [root@m01 func]# curl -I -m 5 -s -w "%{http_code} " -o /dev/null www.baidu.com 200 # 也可通过查看 状态码 查看 URL 是否正常 # 示例代码: [root@m01 func]# cat checkurl.sh #!/bin/bash ############################################################## # File Name: checkurl.sh # Version: V1.0 # Author: neo # Organization: anonymous # Created Time : 2019-06-29 09:19:34 # Description: ############################################################## function usage(){ # 输入有误时的函数 echo "Usage:$0 url" exit 1 } function checkurl(){ # 检测网站是否正常的函数 wget -q -o /dev/null -t 2 -T 5 $1 if [ $? -eq 0 ] then echo "$1 is ok" else echo "$1 failed" fi } function main(){ # 相当于 入口函数 if [ $# -ne 1 ] then usage # 如果输入的参数个数不为1,则调用 usage 函数 fi checkurl $1 # 调用检测url的函数 } main $* # $* :把所有的参数都传给 main 函数 [root@m01 func]# sh checkurl.sh Usage:checkurl.sh url [root@m01 func]# sh checkurl.sh www.baidu.com 2 Usage:checkurl.sh url [root@m01 func]# sh checkurl.sh www.baidu.com www.baidu.com is ok
case 条件句
case结构条件句相当于多分支的 if/elif/else 条件句,但是它比这些条件句看起来更规范工整,常被用于实现系统服务启动脚本等企业应用场景中。 # case语句的语法: case "变量" in 值1) 指令1... ;; 值2) 指令2... ;; 值3) 指令3... ;; *) 指令4... esac # 示例代码: [root@m01 func]# cat case01.sh #!/bin/bash cat <<EOF 1. install lamp 2. install lnmp 3. exit EOF read -p "pls input an integer from above:" num # 1. 判断是否为数字 expr 2 + $num &>/dev/null if [ $? -ne 0 ] then echo "Usage:$0 {1|2|3}" exit 1 fi # 判断执行处理 case $num in 1) echo "install lamp..." ;; 2) echo "install lnmp..." ;; 3) echo "bye" exit ;; *) echo "Uage:$0 {1|2|3}" exit 1 esac [root@m01 func]# sh case01.sh 1. install lamp 2. install lnmp 3. exit pls input an integer from above:1 install lamp... [root@m01 func]# sh case01.sh 1. install lamp 2. install lnmp 3. exit pls input an integer from above:3 bye [root@m01 func]# sh case01.sh 1. install lamp 2. install lnmp 3. exit pls input an integer from above:6 Uage:case01.sh {1|2|3}
示例1:给不同内容加不同的颜色
[root@m01 func]# cat case02.sh #!/bin/bash ############################################################## # File Name: case02.sh # Version: V1.0 # Author: neo # Organization: anonymous # Created Time : 2019-06-30 23:38:25 # Description: ############################################################## red="