mahonglin123456 发表于 2018-8-22 10:03:48

shell常见操作

  想成为一名合格的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-namelost* >all_log 2>&1
  还有一种简单的写法find/home-namelost* >& all_log
  如果出错信息并不重要,不需要保存到文件中去,可以用这个命令:
  find/home-namelost* 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-ntfile2            文件file1比file2更新
  file1-otfile2            文件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
  then
  statments
  fi
  或者
  if
  then
  statments
  else
  statments
  fi
  或者
  if
  then
  statments
  else if
  then
  statments
  else
  statments
  fi
  或者
  if
  then
  statments
  elif
  then
  statments
  else
  statments
  fi
  值得说明的是如果你将if和then简洁的写在一行里面,就必须在then前面加上分号,
  如:if;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
  do
  statments
  done
  其中$var是循环控制变量,是$var需要遍历的一个集合,do/done对包含了循环体,相当于C++中的一对
  大括号。另外如果do和for被写在同一行,必须在do前面加上“;”。
  # cat test1.sh #!/bin/bash
  for day in Sun Mon Tue Wed Thu Fri Sat
  do
  echo $day
  done
  # ./test1.sh
  Sun
  Mon
  Tue
  Wed
  Thu
  Fri
  Sat
  注意如果列表被包含在一对双引号中,则被认为是一个元素
  # cat test1.sh #!/bin/bash
  for day in &quot;Sun Mon Tue Wed Thu Fri Sat&quot;
  do
  echo $day
  done
  exit 0
  # ./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
  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结构进行分支执行的例子:
  # cat case.sh #!/bin/bash
  echo &quot;Hit a key, then hit return.&quot;
  read Keypress
  case &quot;$Keypress&quot; in   [
   )
  echo &quot;Lowercase letter&quot;;;
   )
  echo &quot;Uppercase letter&quot;;;
   )
  echo &quot;Digit&quot;;;
  * )
  echo &quot;Punctuation, whitespace, or other&quot;;;
  esac
  exit 0
  # ./case.sh
  Hit a key, then hit return.
  r
  Lowercase letter
  # ./case.sh
  Hit a key, then hit return.
  T
  Lowercase letter
  # ./case.sh
  Hit a key, then hit return.
  2
  Digit
  break/continue
  BASH语句可以让程序流程从当前循环体重完全跳出,而continue语句可以跳过档次循环的剩余部分并直接进入下一次循
  环。
  函数的使用:
  函数的定义
  BASH是一个相对简单的脚本语言,不过为了方便结构化设计,BASH中也提供了函数定义的功能。bash中的函数定义很简
  单,只要像下面这样就行了;
  functionmy_funcname {
  codeblock
  }
  或者
  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]
查看完整版本: shell常见操作