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

系统管理中 bash shell 脚本常用方法总结

[复制链接]

尚未签到

发表于 2015-4-29 08:16:42 | 显示全部楼层 |阅读模式
  在日常系统管理工作中,需要编写脚本来完成特定的功能,编写shell脚本是一个基本功了!
在编写的过程中,掌握一些常用的技巧和语法就可以完成大部分功能了,也就是2/8原则.

1. 单引号和双引号的区别
  单引号与双引号的最大不同在于双引号仍然可以引用变量的内容,但单引号内仅是普通字符 ,不会作变量的引用,直接输出字符窜。请看如下例子:

  [iyunv@linux ~]# name=HaHa
  [iyunv@linux ~]# echo $name
  HaHa
  [iyunv@linux ~]# myname="$name is wow"
  [iyunv@linux ~]# echo $myname
  HaHa is wow
  [iyunv@linux ~]# myname='$name is wow'
  [iyunv@linux ~]# echo $myname
  $name is wow  

  从上面例子可以看出,使用了单引号的时候,那么$name只是普通字符,直接输出而已!

2. 逐行读取文件


  • 使用for循环来读取文件
      for line in `cat file.txt`
      do
      echo $line
      done

注意:由于使用for来读入文件里的行时,会自动把空格和换行符作为一样分隔符,如果行里有空格的时候,输出的结果会很乱,所以只适用于行连续不能有空格或者换行符的文件


  • 使用while循环读取文件
      cat file.txt |while read line
      do
      echo $line
      done
      或者:
      while read line
      do
      echo $line
      done < file.txt

注意:由于使用while来读入文件里的行时,会整行读入,不会关注行的内容(空格..),所以比for读文件有更好的适用性,推荐使用while循环读取文件

3. bash shell 脚本中常用隐含变量

$0当前执行的脚本或者命令名称
$1-$9代表参数的位置. 举例 $1 代表第一个参数.
$#脚本调用的参数的个数
$@所有参数的内容
$*所有参数的内容
$$当前运行脚本的进程号
$?命令执行后返回的状态
$!后台运行的最后一个进程号

注意: $? 用于检查上一个命令执行是否正确(在Linux中,命令退出状态为0表示该命令正确执行,任何非0值表示命令出错)
$$ 变量最常见的用途是用做暂存文件的名字以保证暂存文件不会重复。
$* 和 $@ 如果输出是一样的,但是在使用for循环,在使用 双引号("")引用时 "$*" 会输出成一个元素 而 "$@" 会按照每个参数是一个元素方式输出
  请看测试例子

  #cat test.sh
  #!/bin/sh
  echo '"$@" output.....'
  for i in "$@"
  do
  echo $i
  done
  echo '"$*" output ....'
  for i in "$*"
  do
      echo $i
  done

  输出结果

  #sh test.sh a b c d
  "$@" output.....
  a
  b
  c
  d
  "$*" output ....
  a b c d

从输出结果可以看出 "$*" 输出是一行 而 "$@" 输出则是四行

4. 变量内容的删除与替换
  我们在一些情况下,需要对变量中的字符窜进行查找删除或者替换,就需要使用下表列出的方法


变量设定方式说明


${变量#关键字}
若变量内容从头开始的资料符合‘关键字’,则将符合的最短资料删除


${变量##关键字}
若变量内容从头开始的资料符合‘关键字’,则将符合的最长资料删除


${变量%关键字}
若变量内容从尾向前的资料符合‘关键字’,则将符合的最短资料删除


${变量%%关键字}
若变量内容从尾向前的资料符合‘关键字’,则将符合的最长资料删除


${变量/旧字串/新字串}
若变量内容符合‘旧字串’则‘第一个旧字串会被新字串取代


${变量//旧字串/新字串}
若变量内容符合‘旧字串’则‘全部的旧字串会被新字串取代
  举例如下(删除字符窜中的某个字符):

  [iyunv@linux ~]# export test_str="/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin"
  [iyunv@linux ~]# echo ${test_str#/*kerberos/bin:}
  /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

5. 变量条件测试赋值
  在某些时刻我们需要‘判断’某个变量是否存在,若变量存在则将此变量值赋值给新的变量,若变量不存在则将其他值赋值给新的变量.


变量设定方式str 未定义str 为空字串str 已赋值为非空字串


var=${str-expr}
var=expr
var=
var=$str


var=${str:-expr}
var=expr
var=expr
var=$str


var=${str+expr}
var=
var=expr
var=expr


var=${str:+expr}
var=
var=
var=expr


var=${str?expr}
expr 输出至 stderr
var=
var=$str


var=${str:?expr}
expr 输出至 stderr
expr 输出至 stderr
var=$str


var=${str=expr}
var=expr
var=
var=$str


var=${str:=expr}
var=expr
var=expr
var=$str
  举例如下:

  [iyunv@linux ~]# test_name=""
  [iyunv@linux ~]# test_name=${test_name-root}
  [iyunv@linux ~]# echo $test_name

运维网声明 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.iyunv.com/thread-61679-1-1.html 上篇帖子: mac中写shell脚本 下篇帖子: 老大让我学Linux之shell变量替换,cat指令,head和tail指令
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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