设为首页 收藏本站
查看: 933|回复: 0

shell笔记_02

[复制链接]

尚未签到

发表于 2015-12-15 15:21:24 | 显示全部楼层 |阅读模式
  1.变量的处理计算变量长度与其他不同方法的耗时对比
  [iyunv@server2 ~]# chars=`seq -s "" 100`2015-1-22
  [iyunv@server2 ~]# echo ${#chars}
  291
  [iyunv@server2 ~]# echo $(expr length "$chars")
  291
  [iyunv@server2 ~]# echo ${chars} | wc -m
  292
  [iyunv@server2 ~]# time for i in $(seq 11111);do count=${#chars};done;
  real 0m2.446s
  user 0m2.415s
  sys
  0m0.028s
  [iyunv@server2 ~]# time for i in $(seq 11111);do count=${chars} | wc -m ;done;
  real 1m0.134s
  user 0m13.734s
  sys
  0m23.029s
  [iyunv@server2 ~]# time for i in $(seq 11111);do count=`echo expr length "${chars}"`;done;
  real 0m18.653s
  user 0m7.708s
  sys
  0m8.562s
  我们看到速度相差几十到上百倍,一般情况调用外部命令处理,与内置功能操作性能相差较
  大。在 shell 编程中我们应尽量使用内置操作或函数完成。
  变量处理替换的一些参考资料
  01)man bash 变量处理大全
  02)http://www.cnblogs.com/chengmo/archive/2010/10/02/1841355.html
  [iyunv@server2 ~]# man bash 进入后查找 word,我们一直往下翻就可以看到对字符的各种处
  
  注:我们要想成为比较好的,我们就要看官方的一首资料,但是如果实在不行,我们可以去
  网上搜集二手的资料,比如别人总结好的资料
  2.变量的数值计算
  变量的数值计算常见的有如下几种命令:
  (())、let、expr、bc $[]
  1) (())用法:(此法很常用,且效率高)
  用于执行简单的整数运算,只需将特定的算术表达式用"$(("和"))"括起来
  shell 的算术运算符号都置于"$(("..."))"的语法中。这一语法如同双引号功能,除了内嵌双引号
  无需转义。
  范例 1:shell 的算术运算实例如下:
  [iyunv@server2 ~]# ((a=1+2**3-4%3))
  [iyunv@server2 ~]# echo $a
  8
  [iyunv@server2 ~]# b=$((1+2**3-4%3))
  //两个**为幂运算
  [iyunv@server2 ~]# echo $b
  8
  [iyunv@server2 ~]# echo $((1+2**3-4%3))
  8
  [iyunv@server2 ~]# echo $((a+=1))
  9
  [iyunv@server2 ~]# echo $((a++))
  9
  [iyunv@server2 ~]# echo $a
  10
  [iyunv@server2 ~]# echo $((a--))
  10
  [iyunv@server2 ~]# echo $a
  9
  [iyunv@server2 ~]# echo $((--a))
  8
  [iyunv@server2 ~]# echo $((3>2))
  1
  [iyunv@server2 ~]# echo $((3 /dev/null ; then
  ID_FILE="$1"
  else
  ID_FILE="$1.pub"
  fi
  shift
  # and this should leave $1 as the target name
  其中:expr "$1" : ".*\.pub" 匹配*.pub 格式的文件如果是则为真非零,如果为假则
  输出 0
  [iyunv@server2 ~]# expr "test.txt" : ".*\.pub"
  0
  [iyunv@server2 ~]# expr "test.pub" : ".*\.pub"
  8
  这里显示的是 test.pub 这个字符串的长度
  判断文件或字符串的扩展名小案例:
  [iyunv@server2 ~]# expr "test.txt" : ".*\.pub" && echo 1 || echo 0
  0
  0
  [iyunv@server2 ~]# expr "test.pub" : ".*\.pub" && echo 1 || echo 0
  8
  1
  通过 expr 判断变量是否为整数
  [iyunv@server2 ~]# vim expr.sh
  #!/bin/bash
  while true
  do
  read -p "Pls input:" a
  expr $a + 0 &>/dev/null
  //expr $a + 0 >/dev/null 2>&1
  [ $? -eq 0 ] && echo int || echo chars
  done
  [iyunv@server2 ~]# sh expr.sh
  Pls input:a
  chars
  Pls input:8.21
  chars
  Pls input:2
  Int
  通过 expr 计算字符串的长度
  [iyunv@server2 ~]# chars=`seq -s "" 100`
  [iyunv@server2 ~]# echo ${#chars}
  291
  [iyunv@server2 ~]# echo $(expr length "$chars")
  291
  4)bc 命令的用法:
  bc 是 UNIX 下的计算器,它也可以用在命令行下面:
  例:
  [iyunv@server2 ~]# i=2
  [iyunv@server2 ~]# echo $i+1
  2+1
  [iyunv@server2 ~]# echo $i+1 | bc
  3
  //可以计算,但是效率比较低
  *因为 bc 支持科学计算,所以这种方法功能非常强大
  [iyunv@server2 ~]# echo 3.5+5 |bc
  8.5
  [iyunv@server2 ~]# echo 3.5+5.6 |bc
  9.1
  [iyunv@server2 ~]# echo 3.5-3.1 |bc
  .4
  通过计算表达式计算
  [iyunv@server2 ~]# seq -s "+" 10
  1+2+3+4+5+6+7+8+9+10
  [iyunv@server2 ~]# seq -s "+" 10 |bc
  55
  [iyunv@server2 ~]# echo "scale=2;5.23 / 3.13" |bc
  //这样表示保留两位小数
  1.67
  [iyunv@server2 ~]# echo "obase=2;8"|bc
  //这样表示进制转换
  1000
  [iyunv@server2 ~]# echo "obase=16;32" |bc
  20
  特点:bc 的特点是支持小数运算
  5)typeset 命令的用法:
  [iyunv@server2 ~]# typeset -i A=1 B=3
  [iyunv@server2 ~]# A=A+B
  //效率高
  [iyunv@server2 ~]# echo $A
  4
  6)$[]的用法:
  [iyunv@server2 ~]# echo $[2+3]
  5
  [iyunv@server2 ~]# echo $[ 2 + 3 ]
  5
  [iyunv@server2 ~]# echo $[2-3]
  -1
  [iyunv@server2 ~]# echo $[2*3]
  6
  [iyunv@server2 ~]# echo $[2/3]
  0
  [iyunv@server2 ~]# echo $[2%3]
  2
  实际解决问题例子:打印数学杨辉三角(第一种为重点)
  http://oldboy.blog.iyunv.com/2561410/756234
  #!/bin/bash
  if(test -z $1);then
  ======================================================================
  3.shell 变量的输入
  Shell 变量除了可以直接赋值或脚本传参外,还可以使用 read 命令从标准输入获得
  『语法格式』
  read 『参数』『变量名』
  『常用参数』
  -p prompt:设置提示信息
  -t timeout:设置输入等待的时间,单位默认为秒。
  范例 1:read 的基本读入
  [iyunv@server2 ~]# read -p "please input a number:" a //指定提示符
  please input a number:3
  [iyunv@server2 ~]# read -t 3 -p "please input a number:" a //指定自动退出时间
  please input a number:[iyunv@server2 ~]#
  [iyunv@server2 ~]# read -t 5 -p "please input a number:" a b
  //可连续接收多个值
  please input a number:33 44
  [iyunv@server2 ~]# echo $a $b
  33 44
  提示:上面 read -p 的功能可以用 echo 和 read 实现
  echo -n “please input two number:”
  read a1 a2
  以上两句和下面的命令相当(-t 排除在外)
  例:实现简单的计算器功能
  read.sh
  #!/bin/bash
  #read -p "please input two numbers:" a b
  echo -n "please input two numbers:"
  read a b
  echo "a+b = $(( $a + $b ))"
  echo "a-b = $(( $a - $b ))"
  echo "a*b = $(( $a * $b ))"
  echo "a/b = $(( $a / $b ))"
  echo "a**b = $(( $a ** $b ))"
  echo "a%b = $(( $a %$b ))"
  如何用循环判断输入的数不是整数,并且重新输入:
  方法一:
  #!/bin/bash
  $a
  $b
  function_input(){
  read -p "Pls input:" c
  for i in $(seq 10)
  do
  expr $c + 0 &>/dev/null
  [ $? -eq 0 ] && break || read -p "please reinput:" c
  done
  }
  function_input;
  a=$c
  function_input;
  b=$c
  echo "a+b = $(( $a + $b ))"
  echo "a-b = $(( $a - $b ))"
  echo "a*b = $(( $a * $b ))"
  echo "a/b = $(( $a / $b ))"
  echo "a**b = $(( $a ** $b ))"
  echo "a%b = $(( $a %$b ))"
  方法二:
  #!/bin/bash
  $a
  $b
  function_input(){
  read -p "Pls input:" c
  while true
  do
  expr $c + 0 &>/dev/null
  [ $? -eq 0 ] && break || read -p "please reinput:" c
  done
  }
  function_input;
  a=$c
  function_input;
  b=$c
  echo "a+b = $(( $a + $b ))"
  echo "a-b = $(( $a - $b ))"
  echo "a*b = $(( $a * $b ))"
  echo "a/b = $(( $a / $b ))"
  echo "a**b = $(( $a ** $b ))"
  echo "a%b = $(( $a %$b ))"
  ======================================================================
  4.条件测试
  1)测试语句
  1.1)条件测试语法
  在 bash 的各种流程控制结构中通常要进行各种测试,然后根据测试结果执行不同
  的操作,有时也会通过与 if 等条件语句相结合,让我们可以方便的完成判断。
  生活中的例子:我要去图书馆,问一下
  『语法说明』
  格式 1:test
  格式 2:[]
  格式 3:[[]]
  说明:
  格式 1 和格式 2 是等价的。
  格式 3 为扩展的 test 命令,有网友推荐用格式 3,老男孩习惯用格式 2.
  提示:
  在[[]]中可以使用通配符。&&、||、>、&/dev/null
  多分支举例:
  a=$1
  b=$2
  if [ $# -ne 2 ]
  then
  echo "Usage:sh $0 num1 num2"
  exit 1
  fi
  if [ $a -gt $b ]
  then
  echo "yes,$a > $b"
  elif [ $a -eq $b ]
  then
  echo "yes,$a = $b"
  else
  echo "yes,$a < $b"
  fi
  加入对数字的判断:
  a=$1
  b=$2
  if [ $# -ne 2 ]
  then
  echo "Usage:sh $0 num1 num2"
  exit 1
  fi
  [ -n "`echo $1 | sed 's/[0-9]//g'`" ] && echo "第 一 个 参 数 必 须 为 数 字 " &&
  exit 1
  [ -n "`echo $2 | sed 's/[0-9]//g'`" ] && echo "第 二 个 参 数 必 须 为 数 字 " &&
  exit 1
  if [ $a -gt $b ]
  then
  echo "yes,$a > $b"
  elif [ $a -eq $b ]
  then
  echo "yes,$a = $b"
  else
  echo "yes,$a < $b"
  fi
  扩展:判断字符串是否为数字的多种方法
  法一:sed 加正则表达式
  命令行传参:
  组合语法判断 1:
  [ -n "`echo $num |sed 's/[0-9]//g'`" -a -n "`echo $2 | sed 's/[0-9]//g'`" ] && echo "两个参
  数都必须为数字" && exit 1
  组合语法判断 2:
  [ -n "`echo $num |sed 's/[0-9]//g'`" -a -n "`echo $2 | sed 's/[0-9]//g'`" ] && {
  echo "两个参 数都必须为数字"
  exit 1
  }
  普通变量判断:
  [ -n "`echo $num |sed 's/[0-9]//g'`" ] &&echo "第二个参数都必须为数字" && exit 1
  条件表达式,大括号的用法
  [ -n "`echo $num |sed 's/[0-9]//g'`" ] && {
  echo "第二个参数都必须为数字"
  exit 1
  }
  法二:变量的子串替换加正则表达式
  [iyunv@server2 ~]# num=hy2015
  [iyunv@server2 ~]# [ -z "`echo "${num//[0-9]/}"`" ] && echo 1 || echo 0
  0
  [iyunv@server2 ~]# num=2015hy2015
  [iyunv@server2 ~]# [ -z "`echo "${num//[0-9]/}"`" ] && echo 1 || echo 0
  0
  法三:变量的子串替换加正则表达式(特殊判断思路)
  思路:如果 num 长度不为 0,并且把 num 中的非数字部分删除,然后看结果是不
  是等于 num 本身,如果两者都成立就是数字。
  -n "num" #->如果 num 长度不为 0 表达式
  "$num" = "${num//^[0-9]/}" #->把 num 中的非数字部分删除,然后看结果是不是等
  于 num 本身,如果两者都成立就是数字。
  [iyunv@server2 ~]# [ -n "$num" -a "$num" = "${num//[^0-9]/}" ] && echo "it is num"
  测试:
  [iyunv@server2 ~]# num=2015
  [iyunv@server2 ~]# [ -n "$num" -a "$num" = "${num//[^0-9]/}" ] && echo "it is num"
  it is num
  法四:expr 计算判断
  [iyunv@server2 ~]# num=2015
  [iyunv@server2 ~]# expr $num + 0 >/dev/null 2>&1
  [iyunv@server2 ~]# [ $? -eq 0 ] && echo int
  int
  
  
  
  邮箱:g2hy@qq.com

  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-151659-1-1.html 上篇帖子: shell笔记_03 下篇帖子: shell笔记_01
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表