shell脚本基础

shell脚本基础

变量

bash的变量: 
环境变量 
本地变量 
位置变量 
特殊变量

本地变量:bash:作用域为整个bash进程

局部变量:作用域为当前代码段 local VARNAME=VALUE

引用变量:${VARNAME}

环境变量:作用域为当前的shell进程及其子进程 export VARNAME=VALUE导出的含义

返回结果

程序执行可能有两类返回值: 
程序执行结果 
程序状态返回代码(0-255) 0表示正常执行,其他的为错误执行 
如检查一下当前主机上是否存在一个叫做student的用户 
id student 然后echo $? 如果存在的话会显示0,否则显示其他

shell的条件测试条件测试类型

数值测试 
-eq :测试两个整数是否相等 
-ne :测试两个整数是否不等,不等为真,等为假 
-gt:测试一个数是否大于另外一个数 
-lt:测试一个数是否小于另外一个数 
-ge:大于或等于 
-le:小于或等于

文件类型的确定 
-e 该档名是否存在 
-f 该档名是否存在且为文件 
-d 该档名是否存在

字符串判断 
test -z string 判定字符串是否为 0 若 string 为空字符串,则为 true 
test str1 == str2 判定 str1 是否等于 str2 ,若相等,则回传 true 
test str1 != str2 判定 str1 是否不等于 str2 ,若相等,则回传 false 
str1 =~ str2 判断str2是否是str1的子串 
-n 与 -z相反

逻辑与和逻辑或 
&& 逻辑与 前面命令是真时才执行后面的命令 
|| 逻辑或 前面命令为假时才执行后面的命令

流程控制

if条件判断 
单层分支 
if [ 条件判断式 ]; then 
当条件判断式成立时,可以进行的指令工作内容; 
fi(这个if非常容易忘记)

多重分支 
if [ 条件判断式 ]; then 
当条件判断式成立时,可以进行的指令工作内容; 
else 
当条件判断式不成立时,可以进行的指令工作内容; 
fi

for循环的结构: 
for 变量 in 列表; do 
循环体 
done

while 循环(适用于循环次数未知的程序) 
语法: 
while CONDITON;do 
statement 
… 
done 
while 需要循环修正 
while 里面的循环初始值需要给出,如i=1 
还需要注意的是需要有循环修正,使得循环不至于一直持续下去

until(直到满足一定条件,循环终止) 
语法: 
until CONDITTION; do 
statement 
… 
done 
即是条件最开始是不满足的,只有当条件满足的时候循环才中止 
与while的当条件不满足时就终止刚好相反 
所以平常中有while的判断条件为 当什么条件不满足的时候就怎么样此时就可以用until

for循环的第二种使用方式 
for (( expr1; expr2; expr3 ));do 
循环体 
done 
expr1 给定变量的初始值 
expr2 判定循环退出条件 
expr3 修正变量的值

case语句 多分支选择结构 
语法

case SWITCH in 这里的SWITCH一般是要引用变量的值 
value1) 
statement 
… 
;; 
value2) 
statement 
… 
;; 
value3) 
statement 
… 
;; 
*) 
statement 
… 
;; 
esac 
其中的value是字符,故前面的字符比较也是可以用的

while的特殊用法1: 
无限循环,加上break之后,在某一条件满足的时候退出 
具体的用法: 
while :;do 
statement 
done

while的特殊用法2: 
while可以从指定的文本文件中以行为单位,依次遍历其中的行 
while read line; do 
statement 
done


 

脚本运用实例

写一个脚本,提示用户输入一个字符串,将其转换为大写后输出,如果用户输入的quit,则退出

 

#!/bin/bash
#
read -p "please input a string : "  STRING
while [ $STRING !=  quit  ];do
        echo "$STRING" | tr 'a-z' 'A-Z'
        read -p "please input a string : "  STRING
done
  

写一个脚本每隔5秒检测Hadoop用户是否登录,如果登录则显示"hadoop  is logged in "

 

 

#!/bin/bash
#
who | grep 'hadoop'
REV=$?
while [ $REV  -ne   0  ];do
        echo "`date`,hadoop is not logged"
        sleep 5
        who | grep 'hadoop'
        REV=$?
done

 

如何测试192.168.0.151~192.168.7.254  之间的主机是否在线,统计个数并将它们显示出来

 

#!/bin/bash
#
declare -i SUM=0
for (( J=250;J<=254;J++ ));do
        for (( K=200;K<=254;K++ ));do
        ping -c 1 -W  1 172.16.$J.$K  &> /dev/null
        REV=$?
                if [ $REV -eq  0  ];then
                        echo -e "\033[32m 172.16.$J.$K\033[0m  is logged"
                        SUM=$[$SUM+1]
                else
                        echo -e "\033[31m 172.16.$J.$K\033[0m  is not  logged"
                fi
        done
done
echo "the number of logged is : $SUM"

 

 

写一个脚本,根据用户的输入情况来决定循环是否继续,如果用户输入的是q则退出,否则一直循环

 

 

  1 #!/bin/bash
  2 #
  3 while :;do
  4         read -p "please input a filename : " FILENAME
  5         if  [ $FILENAME == ‘q’    ];then
  6                 break
  7         fi
  8 done

 

脚本综合运用

 

写一个脚本,为指定的硬盘创建分区
    列出当前系统上的所有磁盘,让用户选择,如果选择q则退出脚本,如果用户选择错误则让用户重新选择
    当用户选择以后,提醒用户接下来的操作可能会损毁数据,并请用户确认,如果用户选择Y就继续,否则,让用户重新选择
    抹除那块硬盘上的所有分区(提示,抹除所有分区后执行sync命令,并让脚本睡眠3秒钟再创建分区):并为其创建3个主分区,第一个为20M,第二个为512M etx3,第三个为128M ext3,
    且第三个分区类型为swap分区类型(提示:将分区命令用echo传送给fdisk即可)

 

 1 #!/bin/bash
  2 #
  3 #program 
  4 #    the  program can make 3  partations
  5 #Author:Double.f
  6 #Date:2017-4-13
  7 
  8 
  9 fdisk -l | grep '^Disk /dev/sd[a-z]' | awk  -F: '{print $1}'   | cut -d' ' -f2 | sed  '$ a \q'
 10 A=`fdisk -l | grep '^Disk /dev/sd[a-z]' | awk  -F: '{print $1}' | cut -d' ' -f2 | sed  '$ a \q'`
 11 
 12 read -p "please choose a disk: " DISK
 13 
 14 while :;do
 15         S=0
 16         for I in  `echo $A`;do
 17 
 18                 if [ $I == $DISK   ];then
 19                         S=1
 20                         break
 21                 fi
 22 
 23         done
 24         if [ $S -ne 1  ];then
 25                 read -p "please choose a disk: " DISK
 26         fi
 27 
 28         if [ $S -eq  1    ];then
 29                 break
 30         fi
 31 done
 32 
 33 if [ $DISK == ‘q’  ];then
 34         echo "Quiting….."

 35         sleep 2
 36         exit 8
 37 fi
 38 
 39 rm -rf /tmp/zhanshi.txt
 40 
 41 read -p "the operation will delte the full data of the $DISK,continue or exit?(Y/N):"  JUDGE
 42 until [ $JUDGE == ‘Y’ -o  $JUDGE == ‘N’      ];do
 43         read -p "Try again,and choose a correct option :" JUDGE
 44 done
 45 
 46 
 47 for I in `mount | grep "$DISK" | awk '{print $1}'`;do
 48         fuser -km $I
 49         umount $I
 50         sleep 1
 51         echo "umount $I finished"
 52 done
 53 
 54 
 55 if  [ $JUDGE == ‘Y’   ];then
 56         dd if=/dev/zero of=$DISK bs=512k count=1 &> /dev/null
 57         sync
 58         sleep 2
 59 echo 'n
 60 p
 61 1
 62 
 63 +20M
 64 n
 65 p
 66 2
 67 
 68 +512M

69 n

70 p

71 3

 72 
 73 +128M
 74 t
 75 3
 76 82
 77 w ' | fdisk $DISK  &> /dev/null
 78 
 79 echo "partation finished !"
 80 sleep 1
 81 echo "mkfs  is going.."
 82 sleep 1
 83 partprobe $DISK
 84 sync
 85 sleep 1
 86 mke2fs -j ${DISK}1 &>/dev/null
 87 mke2fs -j  ${DISK}2 &> /dev/null
 88 mkswap  ${DISK}3 &> /dev/null
 89 
 90 echo "mkfs is finished !"
 91 sleep 1
 92 echo "Preparing mount …."
 93 read -p "please input a mount directory ${DISK}1:" DIR1
 94 read -p "please input a mount directory ${DISK}2:" DIR2
 95 read -p "please input a mount directory ${DISK}3:" DIR3
 96 
 97 until [ $DIR1 != $DIR2 -a $DIR1 != $DIR3 -a $DIR2 != $DIR3    ];do
 98         echo " mount is busy !!!please choose other directory"
 99          read -p "please input a mount directory ${DISK}1:" DIR1
100          read -p "please input a mount directory ${DISK}2:" DIR2
101          read -p "please input a mount directory ${DISK}3:" DIR3
102 done

 

103 
104 mount ${DISK}1 $DIR1
105 mount ${DISK}2 $DIR2
106 swapon ${DISK}3
107 
108 sleep 1
109 echo "mount is finished !"
110 
111 else
112       exit 9
113 fi

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

(0)
Double fDouble f
上一篇 2017-04-16 09:46
下一篇 2017-04-16 13:49

相关推荐

  • 搭建一套LVS-DR模型的高性能集群(LVS-DR+Nginx+Mariadb+Nfs+php-fpm+wordpress)

    架构简介 参加马哥linux培训一周了,自己感觉每天都进步很多,现在来说说这个架构,也是架构师第一周的作业第二题。搭建一套LVS-DR模型的高性能集群,做了两天终于完成并实现了这个架构,我设计的架构图如下所示: 此架构主要是用ipvsadm来实现高性能集群,Realserver(RS1,RS2)安装配置nginx,RS服务器分别配置了一个内网,一个外网。正常…

    Linux干货 2016-12-06
  • linux任务管理与计划

    linux系统作业控制的命令:     job(作业):一个作业通常包含多个命令(也有可能只包含一个),联合起来由单个小程序组合,完成复杂任务,对Linux而言作业有两种;前台作业和后台作业        前台作业(forgroud):通过终端启动,且启动后会…

    Linux干货 2016-09-13
  • 数据结构-栈和队列

    1.栈 1.1 栈的定义 栈是一种特殊的线性表。其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行。如下所示: 结论:后进先出(Last In First Out),简称为LIFO线性表。 栈的基本运算有六种: 构造空栈:InitStack(S)、 判栈空: StackEmpty(S)、 判栈满: StackFull(S)、 …

    Linux干货 2015-04-07
  • Linux三剑客之sed命令

    一.sed命令概述 Stream EDitor ,行编辑器 sed是一种流编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为”模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕.接着处理下一行,这样不断重复,直到文件末尾.文件内容并没有改变除非你使用重定向存储输出.sed主…

    Linux干货 2016-08-15
  • N25-Bazinga-第二周作业

    1.Linux文件管理类命令 命令 功能 命令 功能 pwd 显示当前目录 ls 显示目录下的内容 cd 改变所在目录 cat 显示文件的内容 grep 在文件中查找字符串 cp 复制文件 touch 创建文件 mv 移动文件 rm 删除文件 rmdir 删除目录 1.1 pwd命令 该命令的英文解释为print working&nbsp…

    Linux干货 2016-12-13
  • 脚本练习

      1、写一个脚本,使用ping命令探测10.1.8.1-10.1.8.10之间所有主机的在线状态,在线的主机使用绿色显示,不在线的主机使用红色显示。     #!/bin/bash     #Test host whether onlin…

    Linux干货 2016-12-18

评论列表(1条)

  • renjin
    renjin 2017-04-21 09:57

    主要介绍了bash编程的基础用法,及示例说明,内容总结的详细,排版也很好,在排版上需要注意将终端命令或代码添加至”插入程序代码”中去,还有在总结的shell程序,建议将注释标明