shell脚本编程总结
一、shell的执行书写格式1.脚本文件名以.sh结尾2.第一行声明#!/bin/bash3.注释其余以#开头的行表示注释vim /root/.vimrc 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,#Email:admintest.com) call setline(6,#Created time:.strftime(%F %T)) call setline(7,#Description:) call setline(8,#########################) call setline(9,) endif endfunc脚本中一般是一行一条命令而且是按照顺序执行每条命令。可以用以下符号在一行连接多条命令;、、||、|执行1.绝对路径或者相对路径执行脚本文件需要x执行权限不会保存2.bash 脚本文件不会保存3.source 脚本文件会保存4. . 脚本文件会保存退出状态码1.可使用echo $?查看命令的退出状态码2.执行成功的命令返回0不成功的命令返回非0值3.脚本可用exit0-255手动指定退出码4.使用函数return 0-255 返回函数的状态码可使用echo $?查看函数的退出状态码0----------------命令运行成功1----------------通知未知错误2----------------误用shell命令126--------------命令不可执行127--------------没有找到命令128--------------无效退出参数128x------------linux信号x的严重错误130--------------命令通过CtrlC终止255--------------退出状态码越界二.变量变量的定义1.只允许使用数字、字母和下划线不能用数字开头2.变量名和变量的值之间用连接等号左右不能有空格3.统一都使用字符串存储name张三 age20 echo $name $age echo 姓名${name}年龄${age}赋值1.var值等号无空格含空格用引号2.命令赋值var$(命令)3.交互式read -p 提示 变量1 变量2位置参数$0脚本名、$1~$9参数、${10}、$*所有参数、$所有参数、$#参数个数、$$进程 PID、$?上条命令状态码#!/bin/bash echo 脚本名$0 echo 第1参数$1 echo 所有参数$ echo 参数个数$# echo 进程ID$$ echo 上条命令状态$?变量生效范围局部变量当前 shell / 脚本函数内用local定义全局环境变量export var永久生效写入~/.bashrc或/etc/profile变量运算整数$((ab))、let、expr小数用bc、awk字符串长度${#var}、切片${var:1:3}、替换${var/old/new}、删除${var#*.}整数a10 b20 echo $((ab))字符串trabcde echo ${#str} echo ${str:1:2}变量扩展${var:-默认值}、${var:默认值}、${var:替换值}、${var:?错误提示}三、条件测试语法test 条件、[ 条件 ]、[[ 条件 ]]、((整数条件))文件测试存在、目录、普通文件、可读 / 写 / 执行、新旧比较。if [ -f /etc/passwd ]; then echo 普通文件; fi if [ -d /tmp ]; then echo 目录; fi if [ -x ./test.sh ]; then echo 可执行; fi if [ -e /test.txt ]; then echo 存在; fi字符串测试空 / 非空、相等 / 不等、正则匹配。str1abc str2abcd [ $str1 $str2 ] [ -z $str1 ] [ -n $str1 ]整数测试等于 / 不等、大于 / 小于、大于等于 / 小于等于。a5; b3 [ $a -gt $b ] echo ab (( a b )) echo ab [[ $a $b ]] echo ab逻辑运算[]-a(与)、-o(或)、!(非)[[]]/(())(与)、||(或)、!(非)[ -f /etc/passwd -a $a -gt $b ] [[ -f /etc/passwd $a -gt $b ]] ! [ $a -eq $b ]四、流程控制if语句#!/bin/bash read -p 输入分数 score if (( score 90 )); then echo 优秀 elif (( score 60 )); then echo 及格 else echo 不及格 ficase语句#!/bin/bash read -p 输入数字1-3 num case $num in 1) echo 一;; 2) echo 二;; 3) echo 三;; *) echo 无效;; esacfor 循环1.数字for i in {1..10};do echo $i done2.c语言for ((i1;i5;i));do useradd test$i done3.文件for file in $(ls /etc);do echo $file donewhile 循环i1 while (( i 5 )); do echo $i ((i)) donebreak/continuebreak 跳出循环continue 跳过本次。for i in {1..10}; do if (( i 3 )); then continue; fi if (( i 7 )); then break; fi echo $i done五、函数定义与调用封装固定结构调用传参。func() { 命令; }调用func 参数返回值return 0-255字符串用echo输出变量默认全局函数内用local定义局部变量数组1.普通数组有序集合索引从 0 开始。arr(a b c) echo ${arr[0]} echo ${arr[]} echo ${#arr[]}2.关联数组declare -A user user[name]zhangsan user[age]20 echo ${user[name]}3.遍历数组for i in ${arr[]};do echo $i done六.文本三剑客1. grep过滤常用-i(忽略大小写)、-n(行号)、-v(反向)、-r(递归)、-E(扩展正则)grep root /etc/passwd grep -i ssh /etc/ssh/sshd_config grep -v # /etc/profile grep -n error log.txt2. sed编辑:常用-i(改原文件)、s/旧/新/g(替换)、d(删除)、a(追加)、i(插入)# 替换 sed s/旧/新/g test.txt # 直接修改文件 sed -i s/SELINUX.*/disabled/ /etc/selinux/config # 删除空行 sed /^$/d test.txt3. awk列处理:核心按行处理、按列分割默认分隔符空格内置变量$0(整行)、$1~$n(列)、NR(行号)、NF(列数)、FS(分隔符)常用print(打印) 数组统计 过滤# 打印列 awk {print $1,$3} /etc/passwd # 过滤 awk -F: $31000 /etc/passwd # 统计 awk {count[$1]} END{for(i in count) print i,count[i]} ip.txt