afox123 发表于 2018-8-23 09:31:34

shell 编程基础

(一)shelll 脚本
  什么是shell脚本?
  简单的说,只要将平时使用的各种linux命令,按顺序保存到一个文本文件中,然后添加可执行权限,这个文件就成为一个shell脚本。
  shell脚本格式:
  #!/bin/bash      //特殊脚本声明,表示此行以后的语句通过/bin/bash程序来解释执行
  #这是一个简单的shell脚本    //#开头表示注释信息
  cd ~root
  touch shell
  mv shell shelll
  echo 这就是shell脚本的基本格式    //echo用于输出字符串,以使脚本输出信息更容易读懂
  shell脚本运行方式
  1.给脚本添加可执行权限(x)
  例:chmod +x shell
  ./shell
  2.通过内部命令sh、source、.
  例:sh -x shell(加 -x参数,可以查看脚本运行过程)
  source shell
  . shell
  (二)shell 变量
  什么是shell变量
  shell变量用来存放系统和用户需要使用的特定参数(值),而且这些参数可以根据用户的设定或系统环境的变化而相应变化,通过使用变量,shell程序能够提供更加灵活的功能,适应性更强。
  set 查看所有shell变量
  unset 删除变量(后跟变量名即可)
  1.自定义变量(本地变量)
  例:_XIAO=this   //设置自定义变量
  echo _XIAO      //查看自定义变量
  注:变量名建议用大写,只能用字母、数字,下划线,而且不能以数字开头
  双引号 ""
  _XIAO1="$XIAO is cat"   //要包括别的变量,或跟多个单词,必须用""括起来
  echo $_XIAO1
  this is cat
  单引号 ''
  _XIAO2='$XIAO is cat !'    //不能包含变量,里面写什么就是什么
  echo $_XIAO2
  $XIAO is cat !
  反撇号 ``
  _XIAO3=`which man`               //将可执行的命令行的结果,赋值给自定义变量
  echo $_XIAO3
  /usr/bin/man
  $()
  _XIAO3=$(rpm -qf $(which man))    //如果要使用多重反撇号,只能用$()表示
  echo $_XIAO3
  man-1.6f-32.el6.x86_64
  expr数值变量的运算
  注:expr命令对整数型变量进行算术变量
  例:
  #!/bin/bash
  #这是个数值变量运算
  VALUE1=10
  VALUE2=20
  VALUE3=30
  A=`expr $VALUE1 + $VALUE2 + $VALUE3`
  echo + $A            +加
  B=`expr $VALUE1 - $VALUE2 - $VALUE3`
  echo - $B            -减
  C=`expr $VALUE1 \* $VALUE2 \* $VALUE3`
  echo "\* $C"         \*乘(因为*是通配符,不能当乘法运算符,所以要加转译符\)
  D=`expr $VALUE1 / $VALUE2 / $VALUE3`
  echo / $D            /除
  read命令:从键盘读入数据,赋给变量
  例:
  #!/bin/bash
  read A B C
  echo one is $A
  echo two is $B
  echo three is $C
  sh read.sh         //执行shell脚本
  10 20 30          //输入10、20、30
  one is 10
  two is 20
  three is 30
  2.环境变量
  set 查看当前工作下的环境变量
  3.位置变量
  将命令行的第一个部分作为命令名,其它部分作为参数。
  例:
  #!bin/bash
  #这是一个位置变量
  ls -l $1 $2 $3   //$0为这个程序的命令名即ls -l,$n为这个程序的第n个参数吧,n=1-9
  sh wzbl.sh file1 fil2 fil3    //file1、file2、file3 分别对应$1 $2 $3
  4.预定义变量
  $* 这个程序的所有参数
  $# 这个程序的参数个数
  $$ 这个程序的PID
  $! 执行上一个命令的PID
  $? 执行上一个命令行的返回值   0为这个程序执行正确非0为不正确
  $0 这个程序本身
  例:
  #!/bin/bash
  #this is ydybl
  echo '$* is' $*
  echo '$# is' $#
  echo '$$ is' $$
  echo '$! is' $!
  echo '$? is' $?
  echo '$0 is' $0
  echo '$1 is' $1
  echo '$2 is' $2
  echo '$3 is' $3
  echo '$4 is' $4
  sh ydybl.sh file1 file2 file3 file4       //执行预定义变量脚本
  $* is file1 file2 file3 file4
  $# is 4
  $$ is 21155
  $? is 0
  $0 is tsbl.sh
  $1 is file1      //位置变量1是file1
  $2 is file2      //位置变量2是file2
  $3 is file3      //位置变量3是file3
  $4 is file4      //位置变量4是file4
  (三)条件测试操作
  1.test条件表达式
  形式一:test 条件表达式
  例:
  test 5 -ne 6 && echo '5不等于6'
  5不等于6
  形式二:[条件表达式]
  例:
  [ 5 -ne 6 ] && echo "5不等于6"
  5不等于6
  字符串测试:
  test xiao = hang 测试字符串是否相等
  test xiao != hang 测试字符串是否不相等
  test xiao测试字符串是否不为空
  test -n xiao 测试字符串是否不为空
  test -z xiao 测试字符串是否为空
  整数测试:
  test xiao -eq hang 测试整数是否相等
  test xaio -ge hang 测试xiao是否>=hang
  test xiao -gt hang 测试xiao是否>hang
  test xiao -le hang 测试xaio是否 /dev/null   //批量设置密码
  done
  (五) while循环语句
  特殊条件测试操作: while true(真) 、while false(假)    //while true 等同于 while :
  let XIAO++使变量XIAO的值增加1(等同于XIAO=`expr $XIAO + 1`)
  exit 0 退出
  break 强制退出
  while循环语句语法结构:
  while 条件测试操作
  do
  命令序列
  done
  例:
  ech#!/bin/bash
  #猜我生日
  D=0
  echo "猜猜我生日吧,我是哪一年"
  while true
  do
  read A
  let D++
  if [ $A -lt 1993 ]
  then
  echo "我有那么老吗?再猜猜看哦! "
  elif [ $A -eq 1993 ]
  then
  echo "你总共猜了${D}次"
  echo "小子,眼力不错嘛?"
  break
  else
  echo "我有那么小吗?再猜猜看哦!"
  fi
  done
  (六)case分支语句
  case 语句的结构:
  case 变量值 in
  模式1)
  命令序列1
  ;;
  模式2)
  命令序列2
  ;;
  ......
  * )      //若找不到任何匹配的值,则执行默认模式
  默认命令序列
  esac
  例:
  e#!/bin/bash
  #整人的心理测试题
  echo " ------------------------------------------------------------"
  echo "|这是一道高智商的心里测试题,作者xiaoxiao|"
  echo " ------------------------------------------------------------"
  echo
  echo "做题前要有心理准备哦!"
  echo "你被困在一个孤岛上,船只能载一个人,你需要选择"
  echo "A 抢船走人"
  echo "B 杀死美女抢船走人"
  echo "C 留下美女天天云雨"
  echo "D 放走美女自己等死"
  echo "请您做出选择,并按Enter键确认"
  F=0
  G="您可尝试做出别的选择"
  while [ $F -lt 4 ]       //当while循环体次数,大于4,程序结束
  do
  read E
  let F++
  case "$E" in
  A)
  if [ $F -ne 4 ]         //if双分支语句和case分支语句套用
  then
  echo "禽兽!"
  echo "$G!"
  else
  echo "禽兽!欢迎下次再来哦!"
  fi
  B)
  if [ $F -ne 4 ]
  then
  echo "禽兽不如!"
  echo "$G!"
  else
  echo "禽兽不如!欢迎回答笑笑问答!"
  fi
  ;;
  C)
  if [ $F -ne 4 ]
  then
  echo "比禽兽还禽兽!"
  echo "$G"
  else
  echo "比禽兽还禽兽!欢迎回答笑笑问答!"
  fi
  ;;
  D)
  if [ $F -ne 4 ]
  then
  echo "不但不如禽兽,还是个蠢货!"
  echo "$G"
  else
  echo "不但不如禽兽,还是个蠢货!拜拜哦!"
  fi
  ;;
  *)      //默认模式
  echo "请您做出正确选择!"
  esac      //case 分支语句结束
  done       //while 循环语句结束
  Shell 语法
  if 语句
  for 循环语句
  while 循环语句
  case 分支语句
  语法格式
  if [条件测试操作1]
  then
  命令序列1
  elif [条件测试2]
  then
  命令序列2
  else
  命令序列3
  fi
  for 变量名 in 取值列表
  do
  命令序列
  done
  while 条件测试操作
  do
  命令序列
  done
  case 变量值 in
  模式1)
  命令序列1
  ;;
  模式2)
  命令序列2
  ;;
  ......
  * )
  默认命令序列
  esac
  说明
  if语句是最为常用的一种流程控制方式,用来根据特定的条件测试结果,分别执行不同的操作(如果.......那么......)
  指定一个变量及可能的取值列表,针对每一个不同的取值,重复执行相同的命令序列,直到变量值用完退出循环
  根据特定的条件反复执行一个命令序列,直到改条件不再满足为止
  case语句可以使脚本程序的结构更加清晰,层次分明
  适用场合
  适用于选择执行的命令语句较多时
  适用于列表对象无规律,且列表来源已固定(如某个列表文件)
  适用于控制循环次数、操作对象按数字顺序编号,按特定条件执行重复操作
  适用于某个变量存在多种取值,需要对其中的每一种取值分别执行不同的命令序列,与多分支if 语句非常相似,只不过if语句需要判断多个不同的条件,而case语句只是判断一个变量的不同值
  小技巧
  取值列表中:
   表示一个范围
  ``直接把命令结果传递给前面变量名
  while true(真)
  while false(假)
  while true等同于while :
  let XIAO++(等同于XIAO=`expr $XIAO + 1`)
  exit 0 退出
  break 强制退出
  模式字符串中:
  表示一个连续范围
  |    表示”或” 例 A|B

页: [1]
查看完整版本: shell 编程基础