首页 > 代码库 > Linux命令:bash脚本编程

Linux命令:bash脚本编程

bash脚本编程简介:

  此文假定你没有任何关于脚本或一般程序的编程知识, 但是如果你具备相关的知识, 那么你将很容易就能够达到中高级的水平. . . 你可以把此文作为参考, 自学手册, 或者是关于shell脚本技术的文档。

  介绍内容包括:

  A:变量、变量类型

  B:条件判断

  C:算术运算

  D:

  E:

  F:

  G:


  A.bash变量类型:


    1)本地变量:(局部变量)

  set VARNAME=VALUE: 作用域为整个bash进程;

 

    2)局部变量:

  local VARNAME=VALUE:作用域为当前代码段;

 

    3)环境变量:作用域为当前shell进程及其子进程;

  export VARNAME=VALUE

     eg1: VARNAME=VALUE    赋值

      export VARNAME    “导出”

 

    4)位置变量:

  $1, $2, ...


    5)特殊变量:

  $?: 上一个命令的执行状态返回值;

  程序执行,可能有两类返回值:

    返回值1.程序执行结果

    返回值2.程序状态返回代码(0-255

        0:正确执行

        1-255:错误执行,12127系统预留;

     eg1: #ls /etc/    执行命令

      #$?  :0   执行状态返回值

      

    6)输出重定向:

  >    覆盖重定向

  >>    追加重定向

  2>    错误重定向

  2>>    错误追加重定向

  &>    追加及错误同时重写向

  eg1: #ls /etc/ >/dev/null | echo $?  >/dev/null软件设备,数据黑洞


    7)撤消变量:

  unset x  撤消变量   unset $x  撤消变量中的值

  unset VARNAME

  eg1: [root@localhost ~]# NAME=Tom    定义变量

    [root@localhost ~]# echo $NAME    显示变量

    Tom
    [root@localhost ~]# unset NAME
    [root@localhost ~]# echo $NAME    撤消变量后变量不显示


    [root@localhost ~]#


    8)查看当shell中变量:   set    包含所有环境变量和本地变量

  eg1:查看当前shell中的环境变量:  printenv  或env  或export

  eg2:

    [root@localhost ~]# ANIMALS=pigs
    [root@localhost ~]# ANIMALS=$ANIMALS:goat
    [root@localhost ~]# echo $ANIMALS

    pigs:goat


    [root@localhost ~]# echo $PATH

    /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

    [root@localhost ~]# echoPATH=$PATH:/usr/local/apache/bin

    PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/apache/bin


******************************************************************************************


  B条件判断:

    1)命令格式:

  如果用户不存在

   添加用户,给密码并显示添加成功;

  否则

   显示如果已经没在,没有添加;


    2)判断条件

  1.条件测试类型: 整数测试    字符测试    文件测试

  2.条件测试的表达式:[expression ]  [[expression ]]  testexpression

  3.整数比较:

    -eq:  两个整数是否相等;          equal

    -ne:  两个整数是否不等;不等,为真;相等,为假;  not equal

    -gt:  一个数是否大于另一个数;大于,为真;否则,为假; greater than

    -lt:  一个数是否小于另一个数;小于,为真;否则,为假; less than

    -ge:  大于或等于       greater than or equal

    -le: 小于或等于       less than or equal

  eg1: [ $A -eq $B ]  每个字符间必须有空格


  3.语句的间逻辑关系:

    逻辑与: &&

     第一个条件为假时,第二个条件不用再判断,最终结果已经有;

     第一个条件为真时,第二个条件必须得判断

    逻辑或: ||

     第一个条件为真或为假时,第二个条件必须得判断


  eg1:如果用户user11不存在,就添加用户user11

    ! id user11 && useradd user11 或  id user11 || useradd user11


  eg2: 如果/etc/inittab文件的行数大于500,就显示好大的文件;

    [ `wc -l /etc/inittab | cut -d‘ ‘ -f1` -gt500 ] && echo "Large files."


  4.变量名称规则:

    1)只能包含字母、数字和下划线,并且不能数字开头;

    2)不应该跟系统中已有的环境变量重名;

    3)最好做到见名知义;


如果用户不存在,添加并且给密码;否则,显示其已经存在;

! id user1 &> /dev/null && useradd user1&& echo "user1" | passwd --stdin user1 || echo "user1 exists."

 

  实例B一:添加3个用户user1, user2,user3;但要先判断用户存在,不存在则再添加;

    添加完成后,显示系統中总共有几个用户;

  #!/bin/bash

  ! id user1 &> /dev/null && useradd user1 || echo "user1 exists."

  ! id user2 &> /dev/null && useradd user2 || echo "user2 exists."

  ! id user3 &> /dev/null && useradd user3 || echo "user3 exists."

  USERS=`wc -l /etc/passwd | cut -d: -f1`

  echo "$USERS users." 


    以下使用IF语句

  #!/bin/bash

  NAME=user110

  if id $NAME &> /dev/null;then  使用命令执行状态结果,要直接执行此命令,一定不能引用

    echo "$NAME exists."

  else

    useradd $NAME

    echo $NAME | passwd --stdin $NAME &> /dev/null

    echo "Add $NAME finished."

  fi

  echo "`wc -l /etc/passwd | cut -d: -f1` users."


  提示:

  1.“引用”一个命令的执行结果,要使用命令引用;

    比如: RESAULTS=`wc -l /etc/passwd | cut -d: -f1`

  2.使用一个命令的执行状态结果,要直接执行此命令,一定不能引用

   比如: if id user1一句中的id命令就一定不能加引号;

  3.想把一个命令的执行结果赋值给某变量,要使用命令引用,

   比如USERID=`id -u user1`;

  4.想把一个命令的执行状态结果保存下来,并作为命令执行成功与否的判断条件,则需要先执行此命令,而后引用其状态结果,如

    id-u user1

    RETVAL=$?

   此句绝对不可以写为:RETVAL=`id -u user1`


  实例B二:给定一个用户:

    1、如果其UID0,就显示此为管理员;

    2、否则,就显示其为普通用户;

  #!/bin/bash

  NAME=user1

  USERID=`id -u $NAME`

  # USERID=`grep "user1:" /etc/passwd | cut -d: -f3`  与上条语句同样功能

  if [ $USERID -eq 0 ]; then  * then为同行前面要有;若then在下一行可不加;

    echo"Admin user."

  else

    echo"common user."

  fi


  实例B三:if语句条件差异


  `id -u$NAME` 命令执行的结果:   if [ `id -u $NAME` -eq0 ]; then *


  id $NAME 命令状态的结果,即执行是否成功:   if id $NAME; then *



  实例B三:给定一个用户,获取其密码警告期限;再判断用户密码使用期限是否已小于警告期限;

    提示:计算方法,最长使用期限减去已经使用的天数即为剩余使用期限;

     如果小于,则显示“Warning”;否则,就显示“OK”。

     圆整:丢弃小数点后的所有内容

#!/bin/bash

#

WARNING=`grep "user1:"/etc/shadow | cut -d: -f6`

S=`date +%s`

T=`expr $S/86400`

LONG=`grep"^student" /etc/shadow | cut -d: -f5`

N=`grep"^student" /etc/shadow | cut -d: -f3`

SY=$[$L-$[$T-$N]]

 

if [ $SY -lt $W ]; then

  echo ‘Warning‘

else

  echo ‘OK‘

fi



  实例B四:判定命令历史中历史命令的总条目是否大于1000

      如果大于,则显示“Some command will gone.”;否则显示“OK”。

 

shell中如何进行算术运算:

A=3

B=6

1let 算术运算表达式

    letC=$A+$B

2$[算术运算表达式]

    C=$[$A+$B]

3$((算术运算表达式))

    C=$(($A+$B))

4expr 算术运算表达式,表达式中各操作数及运算符之间要有空格,而且要使用命令引用

    C=`expr$A + $B`

  



Linux命令:bash脚本编程