bash脚本编程

bash脚本编程之用户交互:

    脚本参数

    用户交互:通过键盘输入数据

    read [option]…[name]…

    -p: "PROMPT"

     -t: TIMEOUT

  #!/bin/bash

  #

  read -p "Enter a username: " name

  [ -z "$name‘] && password="password"

  if id $name &> /dev/null; then

       echo "$name exists."

  else

  useradd $name

       echo "$password" | passwd –stdin $name &> /dev/null

       echo "Add user $name finished."

  fi

  bash -n /path/to/fome_script

       检测脚本中的语法错误

  bash -x /path/to/some_script

       调试执行

  示例:

  #!/bin/bash

  #Version:0.0.1

  #Version:MageEdu

  #Description: read testing

  read -p "Enter a disk special file:"diskfile

  [ -z "$diskfile" ] && echo "Fool" && exit 1

  if fdisk -l | grep "^Disk $diskfile" &> /dev/null; the

   fdisk -l &

  else

      echo "wrong disk special file."

   exit2

   fi

   过程是编程语言的执行流程:

       顺序执行

       选择执行

       循环执行

       选择执行:

  (1)&&,||

  (2)if 语句

  (3)case语句

          

   if语句:三种格式

   单分支的if语句

   if CONDITION,then

   if-true-分支;

   fi

   双分支的if语句

   fi CONDITION; then

   if-true-分支

   else

   if-false-分支

   fi

   多分支的if语句

   if CONDITION1; then

     条件1为真分支;

   elif CONDITION2;then

     条件2为真分支

   elif CONDITION3; then

     条件3为真分支

     …….

   elif CONDITIONn; then

    条件n为真分支  

   else

   所有条件均不满足是的分支

    fi

  注意:即便多个条件可能同时都能满足,分支之后执行其中一个,首先测试为“真”;


示例:脚本参数传递路径给脚本,判断此文件的类型;

   #!/bin/bash

   # 

   if [ $# -lt 1 ]; then

       echo "At least on path."

       exit 1

   fi

   if ! [ -f $1 ]; then

        echo "No such file."

        exit 2

   fi

   if [ -f $1 ]; then

       echo "Common file."

   elif [ -d$1 ]; then

        echo “Directory."

   elif [ -L $1 ]; then

         echo :Symbolic link."

   elif [ -b $1 ]; then

          echo "block special file."

   elif [ -c $1 ]; then

          echo "character special file."

   elif [ -S $1 ]; then

           echo "Socket file."

   else

         echo "Unkown."

   fi

   注意: if语句可嵌套;

   练习:写一个脚本

      (1)传递一个参数给脚本,此参数为用户名;

      (2)根据其ID号来判断用户类型;

           0:管理员

           1-999:系统用户

           1000+:登录用户

   先vim usertype.sh

   #!/bin/bash

   #

   [ $# -lt  1 ] && echo "At least on user name." && exit 1

   ! id $1 &>/dev/null && echo "No such user." && exit 2

   user id=$(id -u $1 )

   if [ $userid -eq 0 ]; then 

     echo "root"

  elif [ $userid -ge 1000 ]; then

     echo "login user."

  else

      echo "system user.”

  fi

  bash -n usertype.sh

  bash -x usertype.sh abc

  bash -x usertype.sh root

  bash -x usertype.sh centos

  bash -x usertype.sh daemon

  cat usertype.sh

 练习:写一个脚本

    (1)列出如下菜单给用户:

        disk)show disks info,

        mem)show memory info;

        cpu)show cpu info;

        *)quit;

  vim sysinfo.sh

  #!/bin/bash

  #

  cat  <<  EOF

  disk)  show disks info

  mem) show memory info

  cpu show  cpu info

  *) QUIT

  EOF

  read -p "Your choice : " option 

  if  [[ "$option"  == "disk" ]]; then

        fdisk -l /dev[sh]d[a-z]

  elif [[ "$option" == "mem" ]]; then

        free -m

  elif [[ "$option" == "cpu" ]]; then

        lscpu

  else

       echo "Unkown option."

   exit 3

  测试:bash -x sysinfo.sh 

 (2)显示用户给出自己的选择,而后显示对应其选择的相应系统信息;

    循环执行:将一段代码重复执行0、1或多次;

    进入条件;条件满足是才进入循环;

    退出条件;每个循环都应该有退出条件;以有机会退出循环;

 

  bash 脚本:

      for 循环

      while循环

      unit循环

  for循环:

     两种格式:

 (1)遍历列表

 (2)控制变量

     遍历列表:

     for VARAIBLE  in LIST; do

     循环体

    done

    进入条件:只要列表有元素,即可进入循环;

    退出条件:列表中的元素遍历完成;

         

    LISTT的生成方式:

  (1)直接给出;

  (2)整数列表

  (a)start..end}

  (b)seq [start  [incremtal]] last

  (3)返回列表命令

  (4)glob

  (5) 变量引用

       $ @,  $*

#!/bin/bash

#

for username in user21 user22 user23; do

        if id $username &> /dev/null; then

               echo "$username exists."

         else

              useradd $username && echo "Add user $username finished."

         fi

         done

示例:求100以内所有的正整数之和;

           sum=0+1

           sum=sum+2

           sum=sum+3

           sum=1+2+3+4…100

#!/bin/bash

#

declare -i sum=0

for i in  {1..100 }; do

          echo "\$sum is $sum, \$i is $i "

          sum=$ [ $sum+$i ]

done

echo $sum

示例:判断/var/log 目标下是每一个文件的内容类型

#!/bin/bash

#

for filename in /var/log/*;do

if [-f $filename ]; then

echo “Common file."

elif [ -d $filename ]: then

echo "Directory."

elif [ -L $filename ]; then

echo "Symbolic link."

elif [ -b $filename ]; then

echo "block special file."

elif [ -c$filename ]; then

echo "character special file."

elif [ -s $filename ]; then

echo "Socket file."

else

echo "Unkown."

done

原创文章,作者:shadow,如若转载,请注明出处:http://www.178linux.com/65494

(0)
shadowshadow
上一篇 2017-01-01
下一篇 2017-01-01

相关推荐

  • linux文本处理三剑客—grep

      cat:concatenate 文本文件查看工具 cat [option] filename… -n:给显示出来的文本行加上编号 -b:非空行编号 -V:显示 ^ -E:显示行结束符$ -T:显示制表符 -A:显示所有控制符-A=-VET -s:压缩连续…

    系统运维 2016-08-05
  • bash变量类型及区别之浅谈

    变量类型,区别 位置变量$0 $1,$2,$# $@ $* 变量的类型:本地变量、环境变量、位置变量 本地变量:生效范围为当前shell进程,对当前shell之外的其他shell进程包括当前shell的子进程均无效 环境变量:生效范围为当前shell进程及子进程 位置变量:$1,…..$n,${10}来表示,用于放脚本在脚本代码中调用通过命令行传…

    Linux干货 2016-08-12
  • 数据结构- 串的模式匹配算法:BF和 KMP算法

    Brute-Force算法的思想 1.BF(Brute-Force)算法   Brute-Force算法的基本思想是: 1) 从目标串s 的第一个字符起和模式串t的第一个字符进行比较,若相等,则继续逐个比较后续字符,否则从串s 的第二个字符起再重新和串t进行比较。 2) 依此类推,直至串t 中的每个字符依次和串s的一个连续的字符序列相等,则称模式匹…

    Linux干货 2015-04-07
  • Linux常用文件管理命令

    常用文件管理命令 cat cat命令连接文件并打印到标准输出设备上,cat经常用来显示文件的内容 语法 cat(选项)(参数) 选项 -n或-number:有1开始对所有输出的行数编号; -b或–number-nonblank:和-n相似,只不过对于空白行不编号; -s或–squeeze-blank:当遇到有连续两行以上的空白行,就代换为一行的空白行; …

    2018-03-11
  • Linux文件类型及颜色标识整理

    Linux文件类型及颜色标识整理 Linux文件系统中有如下的文件类型: 类型1:普通文件—-à白色 类型2:目录文件—à蓝色 类型3:链接文件—à浅蓝色 类型4:字符设备文件—à黄色 类型5:块设备文件—-à黄色 类型6:管道文件—à青黄色 类型7:套接字文件—à粉红色 为…

    Linux干货 2016-10-19
  • 那些年我们一起追过的缓存写法(二)

    原文出处: 蘑菇先生   上次主要讨论缓存读写这块各种代码实现。本篇是就上次的问题接着来,继续看那些年我们各种缓存用法。 一:缓存预热 上次有同学问过。在第一次加载时,我们的缓存都为空,怎么进行预热。 单机Web情况下,一般我们使用RunTimeCache。相对于这种情况下: 1:我们可以在启动事件里面刷新 1 2 3 4 vo…

    Linux干货 2015-03-04

评论列表(1条)

  • luoweiro
    luoweiro 2017-02-23 08:07

    希望基础知识总结后能有对应的实验脚本,脚本是练习的,不只是整理语法。