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

shell常见操作

[复制链接]

尚未签到

发表于 2018-8-22 10:03:48 | 显示全部楼层 |阅读模式
  想成为一名合格的linux运维人员,shell编程必不可少。
  下面是我摘抄的一些shell规范 供自己以后学习工作使用:
  find   /home -name lost* 2>err_log表示将标准错误输出,输出到err_log里面;
  find   /home -name lost*  >all_log  表示将标准输出输出到all_log里面;其结果只有标准输出被输入到all_log中
  ,要想让标准错误输出与标准输出一道放入到all_log内,要用以下命令:
  find  /home  -name  lost* >all_log 2>&1
  还有一种简单的写法find  /home  -name  lost* >& all_log
  如果出错信息并不重要,不需要保存到文件中去,可以用这个命令:
  find  /home  -name  lost* 2>/dev/null
  bash编程规则:
  1、变量赋值时,'='左右两边都不能有空格;
  2、BASH中的语句结尾不需要分号(";");
  3、除了在变量赋值和在FOR循环BASH中的变量必须在变量前加"$"符号;更细致的文档甚至提到以单引号括起来的变量
  将不被BASH解释为变量,如‘$STR',而被看成是纯纯的字符串。而且更为标准的变量引用方式是${STR}这样的,$STR自
  不过是对${STR}的一种简化。在复杂情况下最好用带{}的表示方式。
  BASH中的变量既然不需要定义,也就没有类型一说,一个变量即可以被定义为一个字符串,也可以被定义为整数。如果
  对该变量进行整数运算,他就被解释为整数;如果对他进行字符串操作,他就被看作为一个字符串。
  请看下面的例子:
  关于整数变量的计算,有如下几种:
  ”+ - * %“,整数运算一般通过let和expr这两个指令来实现,如对变量x加1可以写作:let "x = $x + 1 "或者
  x='expr $x + 1'
  在比较操作符上,整数变量和字符串变量各不相同,如下:
  备注               整数操作           字符串操作
  相同               -eq                   =
  不同               -nq                  !=
  大于               -gt                   >
  小于               -lt                   <
  大于或等于         -ge
  小于或等于         -le
  为空               -z
  不为空             -n
  例子如下:
  比较字符串a和b 是否相等就写作:   if[ $a = $b ]
  判断字符串a是否为空就写作:      if[-z $a]
  BASH中的变量除了用于对整数和字符串进行操作以外,另一个作用就是作为文件变量。
  BASH是linux操作系统的Shell,因此系统的文件必然是BASH需要操作的重要对象,如if[-x  /root]
  可以用于判断/root目录是否可以被当前用户进入。
  列出BASH中用于判断文件属性的操作符,如下:
  运算符                     含义 (满足下面要求时返回TRUE)
  -e   file                   文件file 已经存在
  -f   file                    文件file是普通文件
  -s   file                    文件file大小不为零
  -d   file                    文件file是一个目录
  -r   file                    文件file对当前用户可以读取
  -w   file                    文件file对当前用户可以写入
  -x   file                    文件file对当前用户可以执行
  -g   file                    文件file的GID标志被设置
  -u   file                    文件file的UID标志被设置
  -O   file                    文件file是属于当前用户的
  -G   file                    文件file的组ID和当前用户相同
  file1  -nt  file2            文件file1比file2更新
  file1  -ot  file2            文件file1比file2更老
  注意上面的file及file1、file2都是指某个文件或目录的路径;
  关于局部变量:
  在 BASH 程序中如果一个变量被使用了,那么直到该程序的结尾,该变量都一直有效。为了使得某个变量存在于一个局
  部程序块中,就引入了局部变量的概念。BASH 中,在变量首次被赋初值时加上 local 关键字就可以声明一个局部变量
  ,如下面这个例子:
  #!/bin/bash
  HELLO=Hello  --全局变量
  function hello{
  local HELLO=World ---局部变量
  echo $HELLO
  }
  echo $HELLO ---显示全局变量
  hello         ---调用hello函数,显示局部变量
  echo $HELLO ---测试得到全局变量并没有被改变
  该程序执行结果如下:
  Hello
  World
  Hello
  这个执行结果表明全局变量 $HELLO 的值在执行函数 hello 时并没有被改变。也就是说局部变量 $HELLO 的影响只存
  在于函数那个程序块中。
  BASH中的变量与 C ++语言中变量的区别
  这里我们为原来不熟悉 BASH 编程,但是非常熟悉 C 语言的程序员总结一下在 BASH 环境中使用变量需要注意的问题
  。
  1,BASH 中的变量在引用时都需要在变量前加上 &quot;$&quot; 符号( 第一次赋值及在For循环的头部不用加 &quot;$&quot;符号 );
  2,BASH 中没有浮点运算,因此也就没有浮点类型的变量可用;  3,BASH 中的整形变量的比较符号与 C 语言中完全
  不同,而且整形变量的算术运算也需要经过 let 或 expr 语句来处理;
  bash中的基本流程控制语法:
  if语句用于判断和分支,其语法规则和C语言的if非常相似。
  fi 表示if语句结束,如果命令执行失败,则会返回一个非0的出口状态,则执行紧随fi之后的命令。
  if  [expression]
  then
  statments
  fi
  或者
  if  [expression]
  then
  statments
  else
  statments
  fi
  或者
  if  [expression]
  then
  statments
  else if [expression]
  then
  statments
  else
  statments
  fi
  或者
  if [expression]
  then
  statments
  elif [expression]
  then
  statments
  else
  statments
  fi
  值得说明的是如果你将if和then简洁的写在一行里面,就必须在then前面加上分号,
  如:if[expression];then ...
  例子:
  #!/bin/bash
  if [ $1 -gt 90 ]
  then
  echo &quot;Good, $1&quot;
  elif [ $1 -gt 70 ]
  then
  echo &quot;OK, $1&quot;
  else
  echo &quot;Bad, $1&quot;  fi   exit 0   上面例子中的 $1 是指命令行的第一个参数,这个会在后面的“BASH 中的特殊保留
  字”中讲解。
  for循环:
  for $var [in word-list]
  do
  statments
  done
  其中$var是循环控制变量,[in word-list]是$var需要遍历的一个集合,do/done对包含了循环体,相当于C++中的一对
  大括号。另外如果do和for被写在同一行,必须在do前面加上“;”。
  [root@localhost ~]# cat test1.sh #!/bin/bash
  for day in Sun Mon Tue Wed Thu Fri Sat
  do
  echo $day
  done
  [root@localhost ~]# ./test1.sh
  Sun
  Mon
  Tue
  Wed
  Thu
  Fri
  Sat
  注意如果列表被包含在一对双引号中,则被认为是一个元素
  [root@localhost ~]# cat test1.sh #!/bin/bash
  for day in &quot;Sun Mon Tue Wed Thu Fri Sat&quot;
  do
  echo $day
  done
  exit 0
  [root@localhost ~]# ./test1.sh
  Sun Mon Tue Wed Thu Fri Sat
  注意上面的例子中,在for所在那行的变量day是没有加&quot;$&quot;符号的,而在循环体内,echo
  所在行变量$day是必须加上$符号的。
  另外如果携程for day 而没有后面的in部分,则day将遍历命令行的所有输入参数。如下面这个程序:
  #!/bin/bash
  for param
  do
  echo $param
  done
  exit 0
  上面这个程序将列出所有命令行参数。for 循环结构的循环体被包含在 do/done 对中,这也是后面的 while、until
  循环所具有的特点。
  while [condition]
  do
  statements
  done
  until 循环的基本结构:
  until [ condition is TRUE]
  do
  statments
  done
  case
  BASH中的case结构域C语言中的switch语句的功能比较类似,可以用于多行分支控制。
  其基本结构是:
  case  &quot;$var&quot; in
  condition1 )
  statments1;;
  condition2 )
  statments2;;
  ...
  *)
  default statments;;
  esac --不匹配,或者执行完某一种情况,都要执行它之后的语句
  下面这个程序是运用case结构进行分支执行的例子:
  [root@localhost ~]# cat case.sh #!/bin/bash
  echo &quot;Hit a key, then hit return.&quot;
  read Keypress
  case &quot;$Keypress&quot; in   [
  [a-z] )
  echo &quot;Lowercase letter&quot;;;
  [A-Z] )
  echo &quot;Uppercase letter&quot;;;
  [0-9] )
  echo &quot;Digit&quot;;;
  * )
  echo &quot;Punctuation, whitespace, or other&quot;;;
  esac
  exit 0
  [root@localhost ~]# ./case.sh
  Hit a key, then hit return.
  r
  Lowercase letter
  [root@localhost ~]# ./case.sh
  Hit a key, then hit return.
  T
  Lowercase letter
  [root@localhost ~]# ./case.sh
  Hit a key, then hit return.
  2
  Digit
  break/continue
  BASH语句可以让程序流程从当前循环体重完全跳出,而continue语句可以跳过档次循环的剩余部分并直接进入下一次循
  环。
  函数的使用:
  函数的定义
  BASH是一个相对简单的脚本语言,不过为了方便结构化设计,BASH中也提供了函数定义的功能。bash中的函数定义很简
  单,只要像下面这样就行了;
  function  my_funcname {
  code  block
  }
  或者
  my_funcname(){
  code block
  }
  第二种写法更接近于C语言中的写法。BASH中要求函数的定义必须在函数使用之前,这是和C语言用头文件说明函数方法
  的不同。
  函数的参数与返回值
  更进一步的问题是如何给函数传递参数和获得返回值。
  参数:
  BASH中函数参数的定义并不需要在函数定义出就制定,而只需要在函数被调用时用BASH的保留变量$1 $2...来引用就可
  以了;
  返回值:
  BASH的返回值可以用return语句来指定返回一个特定的整数,如果没有return语句显示的返回一个返回值,则返回值就
  是该函数最后一条语句执行的结果(一般为0,如果执行失败,则返回错误码)。函数的返回值在调用该函数的程序体
  中通过$?保留字来活得。下面我们就来看一个用函数来计算整数平方的例子:
  #!/bin/bash
  xscl(){ #函数并不需要制定参数
  #let或者expr 来执行整数运算
  let &quot;res = $1 * $1
  return  $res
  }
  xscl $1  #调用函数
  result=$?  #$?此保留字保存的是它之前最后一条语句的执行结果,函数的返回值被保存在了$?字中,这里赋给了变量
  result
  echo $result  #显示出xscl $1的执行结果
  exit 0 #如果前面执行成功的话,以0值为返回值推出,即为该脚本的出口状态。
  bash中特殊保留的符号:
  $IFS    这个变量中保存了用于分割输入参数的分割字符,默认空格
  $HOME   这个变量中存储了当前用户的根目录路径
  $PATH   这个变量中存储了当前Shell的默认路径字符串
  $ps1    表示第一个系统提示符
  $ps2    表示第二个系统提示符
  $PWD    表示当前工作路径
  $EDITOR 表示系统的默认编辑器名称
  $BASH   表示当前Shell的路径字符串
  $0,$1,$2... 表示系统传给脚本程序或脚本程序传给函数的第0个、第一个、第二个等参数。
  $#  表示脚本程序的命令参数个数或者函数的参数个数
  $$  表示该脚本程序的进程号,常用于生成文件名唯一的临时文件
  $?  表示脚本程序或函数的返回状态值,正常为0,否则为非0的错误号。
  $*  表示所有的脚本参数或函数参数
  $@  和$*含义相似,但是比$*更安全
  $!  表示最近一个在后头运行的进程的进程号
  随机数
  随机数是经常要用到的,BASH中也提供了这个功能:
  #!/bin/bash
  a=$RANDOM
  echo $a
  exit 0
  这个程序可以再每次执行的时候随机打印出一个大小在1到65535之间的整数。
  运算符
  算术运算符
  + - * / %表示加减乘除和取余运算
  += -= *= /=同C++
  bash -x bash-script 命令,可以查看一个出错的BASH脚本到底错在什么地方,可以帮助程序员找出脚本中的错误。
  let 与expr 的计算技巧
  let  运算时要加一个引号把运算部分引起来
  expr  不用加引号就可以直接运算出结果


运维网声明 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-554985-1-1.html 上篇帖子: Linux Shell常用技巧(七) find xargs-prozrtr 下篇帖子: 每日一shell(五)批量去除文件后缀
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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