wshq 发表于 2018-8-18 14:35:20

bash shell基础编程

  一. BASH Shell编程基础
  1. BASH Shell的可执行文件
  (1) 内部命令
  (2) 外部命令
  (3) 脚本文件
  2. BASH Shell的命令解释过程
  在path指定范围内查找(外部命令)
  ......
  3. BASH Shell的变量
  (1) 变量的分类
  -按作用域分
  a. 局部变量
  b. 全局变量
  -按用途分
  a. 自定义变量
  b. 系统环境变量(path)
  c. 特殊变量
  (2) 定义和引用变量
  -定义变量: 即用即定义、不用加$
  注: 可用export命令将变量输出为全局变量
  -引用变量: $变量名
  -取消变量定义: unset变量名
  (3) 系统环境变量
  HISTSIZE       定义历史记录的大小
  PATH         定义通用路径
  LANG/LANGUAGE定义默认语言
  HOSTNAME       定义主机名
  SHELL          定义用户的shell类型
  USRENAME       登陆名
  HOME         用户的家目录
  PWD            当前工作目录
  注: env命令可以查看当前用户环境的变量
  (4) 特殊变量或预定义变量
  $1-$9代表位置参数
  $0   代表命令名称
  $$   命令进程的PZD
  $#   命令的位置参数的个数
  $*   命令的所有位置参数
  4. BASH SHELL的运算符
  (1) 算数运算符
  + -
  (2) 比较运算符
  -数值比较
  -gt 大于
  -eq 等于
  -lt 小于
  -ge 大于等于
  -le 小于等于
  -ne 不等于
  -字符串比较
  = 等于
  != 不等于
  -z 判断字符串是否为空
  (3) 逻辑运算符
  -a与
  -o或
  !   非
  (4) 文件判定运算符
  -e判断文件是否存在
  -r判断文件是否可读
  -w判断文件是否可写
  -x判断文件是否可执行
  -d判断文件是否为目录文件
  -f判断文件是否为普通文件
  -c判断文件是否为字符设备文件
  -b判断文件是否为块设备文件
  5. Bash Shell中的特殊字符
  (1) 文件通配符
  *            所有字符
  ?            任意单个字符
  [..]         指定范围内的字符
  [^/!..]      指定非范围内的字符
  {字符,...n}    指定集合内的字符
  (2) 替换符
  -$                  引用变量
  -${变量名}          引用指定变量的值
  -`命令`             引用指定命令的结果
  -$(命令)            引用指定命令的结果
  -$(( 算术表达式 ))引用指定表达式的值
  (3) 其它特殊字符
  -'字符'             表示字符串,关闭所有引用,引用所有被括起来的字符
  -"字符"             表示字符串,引用所有除$和``以外的字符
  -\字符            转义字符
  6. BASH Shell提供的内部命令
  (1) echo
  作用: 显示指定内容
  格式: echo [参数] 字符串/表达式
  实例: #echo "linuxsystem"
  #echo -n"unix:"
  #echo -n"china:"
  -n 不换行输出
  (2) read
  作用: 从键盘给指定变量赋值
  格式: read 变量名
  实例: #read a
  (3) test
  作用: 判断表达式结果是否为真
  格式: test表达式
  实例: #test$USER="root" && echo "current user isadministrator"
  #test -x/usr/sbin/useradd && /usr/sbin/useradd u3
  注: 可用[ 表达式 ]来替换test命令
  –x   文件存在并且可执行
  (4) if
  作用: 实现条件分支
  格式: if 表达式/命令;
  then
  ...
  命令
  ...
  [else
  ...
  命令
  ...
  ]
  fi
  实例: #if [`id-u`="0"];then echo "current user is root";else echo"current user is not root";fi
  (5) case
  作用: 实现多种条件分支
  格式: case 变量 in
  值1)
  ...
  命令
  ;;
  值2)
  ...
  命令
  ;;
  值3)
  ...
  命令
  ;;
  ....
  *)
  ...
  ;;
  esac
  实例: #vi /script/sh1
  #!/bin/bash
  echo -n"Input:"
  read a
  case $ain
  off)
  poweroff
  ;;
  windows)
  init 5
  ;;
  reboot)
  reboot
  ;;
  *)
  echo"please input off/windows/reboot"
  ;;
  esac
  (6) for
  作用: 实现循环执行命令行
  格式: for 变量名
  do
  ...
  命令行
  ...
  done
  实例: #for i in"/etc/*";do echo $i;done//遍历etc下文件
  (7) while
  作用: 实现循环执行命令行
  格式: while 表达式/命令行
  do
  ...
  命令
  ...
  done
  实例: #vi /script/sh3
  #!/bin/bash
  a=1
  s=0
  while [$a -le 10 ]
  do
  s=$(($s+$a ))
  a=$(($a+1 ))
  done
  echo $s
  (8) exit
  作用: 退出程序
  格式: exit
  (9) break/continue
  作用: break   退出循环
  continue进入下一次循环
  格式: break
  continue
  (10) function
  作用: 自定义函数
  格式: function 函数名()
  {
  ...
  函数体
  ...
  }
  函数名
  6. 执行Bash脚本
  (1) 方法一
  设置脚本文件允许用户具有执行权限,然后用户可输入脚本的路径即可执行
  #./5.sh
  (2) 方法二
  #bash 脚本路径
  7. 实例:
  请编写shell脚本,完成以下功能:
  (1)shell脚本运行时会在屏幕上显示以下画面
  *********************************************
  *               Main Menu               *
  *         1. poweroff                     *
  *         2. start iptables               *
  *         3. create user                  *
  *         4. exit                         *
  *********************************************
  (2) 按菜单项前的数字可实现相应的功能
  #vimenu.sh
  #functionmu()
  #{clear
  echo"*********************************************"
  echo"*                Main Menu                  *"
  echo"*         1. poweroff                     *"
  echo"*         2. start iptables               *"
  echo"*         3. create user                  *"
  echo"*         4. exit                         *"
  echo"*********************************************"
  #}
  #functionft()
  echo -n"please input:"
  read f
  case $fin
  1)
  poweroff
  ;;
  2)
  startiptables
  ;;
  3)
  echo -n"useradde"
  read u
  useradd$u
  passwd$u
  ;;
  4)
  exit
  ;;
  *)
  echo"please input 1/2/3"
  ;;
  esac
  mu
  ft
  #chmodu+x menu.sh
  二. 文本过滤命令
  1. head
  作用: 显示指定文件的前n行内容
  格式: head [-数字] 文本文件
  实例: #head -3/etc/passwd
  2. tail
  作用: 显示指定文件的未尾n行内容
  格式: tail -n/+n/-f 文本文件
  -f参数,会实时的监视某程序
  实例: #tail -3/etc/passwd
  #tail +3/etc/passwd
  #tail -f/var/log/message
  3. uniq
  作用: 检查及删除文本文件中的重复行
  格式: uniq [参数] 文本文件
  实例: #uniq /abc/f1
  #unisq-d /abc/f1
  -d:只输出重复的行
  4. sort
  作用: 对指定文本内容排序显示
  实例: #sort /etc/f1
  #sort-t: +2 -3 -n /etc/passwd
  #sort -r/abc/f2
  -n 数字大小排序
  -r 反向排序
  -t:+2从第二列开始排
  5. grep
  作用: 从文本文件中提取符合条件的行
  格式: grep [参数] "匹配字符串" 文本文件
  实例: #grep"root" /etc/passwd
  #grep -c"root" /etc/passwd
  #grep -q"root" /etc/passwd
  #grep -v"root" /etc/passwd
  #grep"^root:" /etc/passwd
  -v反向匹配
  -w完整匹配
  -i忽略大小写
  -c只显示符号要求的几行
  -qquiet 安静模式
  6. sed
  作用: sed是一种基于命令行的非交互式文本编辑器
  格式: sed [参数] 子命令文本文件
  实例: -输出内容: p子命令
  #sed -n'/root/p' /etc/passwd//显示有root行的内容
  #sed -n'3p' /etc/passwd   //显示第三行内容
  #sed -n'3,10p' /etc/passwd//显示3到10行内容
  #sed -n'10,$p' /etc/passwd//显示10行到最后一行的内容
  -删除内容: d子命令
  #sed'/root/d' /etc/passwd //删除有root的行
  #sed'4d' /etc/passwd//删除第四行
  #sed '4,8d'/etc/passwd//删除4到8行的内容
  -替换内容: s子命令
  #sed's/root/admin/g' /etc/passwd//把root替换成admin
  #sed -n's/root/admin/gp' /etc/passwd//把root替换成admin
  -读取指定文件内容: r子命令
  #sed '4r/abc/f1' /abc/f2
  #sed '$r/etc/shadow' /etc/passwd //passwd要读取的文件
  -将符合条件的行写入文件: w子命令
  #sed -n'3,10w/abc/f3' /etc/passwd //读取/etc/passwd文件第三行到第十行写入文件/abc/f3
  -向文件添加内容: a子命令
  #sed'3a\linux system' /abc/f1 //第三行后面加上linux system
  #sed'/root/a\unix' /abc/f1 //有root的行后面加下unix
  -向文件插入内容: i子命令
  #sed'3i\linux' /abc/f1//向文件第三行插入linux字符串(新行)
  -多次编辑: -e 参数
  #sed -e'1,10d' -e 's/root/admin/g' /abc/f1
  -n:使用安静(silent)模式:匹配到的就显示出来。反之不显示
  三. awk
  1. 什么是awk
  awk是一种具有编程功能非交互式编辑器,可用于提取、修改文本内容
  2. awk的使用方法
  方法一: #awk [参数] '{awk程序}' 文本文件
  方法二: #awk [参数] -f 脚本文件 文本文件
  方法三: #awk 脚本文件 文本文件
  [-F|-f|-v]   大参数,-F指定分隔符,-f调用脚本,-v定义变量var=value
  3. 认识文本文件的记录和字段
  (1) 以特定记录分隔符结束的内容称之为记录,默认记录分隔符为换行符,可用$0引用整个记录
  (2) 每个记录中由特定字符分隔的内容称之为字段,默认字段分隔符为空格,可用$1-$n引用字段
  ipadd192.168.16.99 mask 255.255.255.0//一行为记录、ipadd为记录中的字段
  4. awk提供的运算符、函数和变量
  (1) awk的运算符
  -算术运算符: + - */ %(取余) ^(乘方)
  -关系运算符:= == != ~(匹配) !~(不匹配)
  -逻辑运算符:&& || !
  -赋值运算符: = +=-= *= /= %= ^=
  -自增、自减运算符: ++--
  -数组引用: in
  (2) awk的变量
  -自定义变量
  awk变量分为数值型和字符型,用户引用变量时即定义了变量,变量类型由变量内容决定,引用变量时不用加$
  -内置变量
  FS   字段分隔符(默认是任何空格)
  RS   记录分隔符(默认是一个换行符)
  NF   当前记录中的字段数
  NR   当前记录数
  OFS输出字段分隔符(默认值是一个空格)
  ORS输出记录分隔符(默认值是一个换行符)
  (3) awk的函数
  -字符串函数
  length(string)               求串string中的字符个数
  substr(string,position,len)返回一个以position开始len个字符的子串
  tolower(string)            转换为小写字符
  toupper(string)            转换为大写字符
  match(string,reg)            返回正规表达式reg匹配的string中的位置
  sub(reg,targetstring)       第一次当正规表达式reg匹配,替换target串中的字符串
  index(search,string)         返回string中search串的位置
  -时间日期函数
  systime()                  返回当前系统日期和时间
  strftime(格式符,日期时间)    返回格式化后的日期和时间,strftime常用的格式符
  %a星期几的缩写(Sun)
  %A星期几的完整写法(Sunday)
  %b月名的缩写(Oct)
  %B月名的完整写法(October)
  %c本地日期和时间
  %d十进制日期
  %D日期 08/20/99
  %H用十进制表示24小时格式的小时
  %I用十进制表示12小时格式的小时
  %m十进制表示的月份
  %M十进制表示的分钟
  %S十进制表示的秒
  %y两位数字表示的年(99)
  %Y四位数字表示的年(9999)
  -数学函数
  int(x)   取整
  rand()   随机数
  sqrt(x)平方根
  5. awk的常用语句
  (1) print
  作用: 输出指定的字符串或表达式的值
  格式: print 字符串/表达式
  实例: #awk -F: '{print$1}' /etc/passwd
  (2) printf
  作用: 格式化输出指定字符串或表达式的值
  格式: printf "格式符/字符串",表达式/变量
  实例: #awk -F: '{printf"username:%s\n",$1}' /etc/passwd
  -转义字符
  \ttable制表位
  \n换行符
  \\表示“\”
  \b表示退格
  -格式符
  %c   输出单个字符
  %d%i输出整数
  %e   按科学计数法输出小数
  %f   输出浮点数
  %s   输出字符串
  %%   输出%
  (3) if
  作用: 实现条件分支
  格式: if(条件表达式)
  {
  ...
  }
  [else
  {
  ...
  }]
  实例: #awk -F:'{if($3==0) {print $0}}' /etc/passwd
  (4) for
  作用: 实现循环执行
  格式:for(init_cntr;test_cntr;incr_cntr)
  {
  ...
  }
  实例: #awk -F:'{for(i=1;i
页: [1]
查看完整版本: bash shell基础编程