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
下一篇 2017-04-16

相关推荐

  • 13-高级文件系统管理-Quota,RAID,LVM

    配置配额系统     综述         在内核中执行         以文件系统(磁盘分区)为单位启用         对不同组或者用户的策略不同         根据块或者节…

    2017-03-16
  • CentOS系统启动

    Linux组成 Linux: kernel+rootfs kernel:  进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能 rootfs: 程序和glibc 库:函数集合, function,  调用接口(头文件负责描述) 过程调用:procedure ,无返回值 函数调用:function 程序:二进制执行文件 内核设计流派…

    2017-05-15
  • 马哥教育的第一天

    春天的北京,比想象中的更加温暖,跨越一千三百公里的距离,我来到马哥教育位于北京昌平区的校区,传说中的春寒料峭似乎遗忘了北京,自湖北出门的时候,车外还是淅淅沥沥的小雨,到达北京,迎接我的却是春风拂面熏人醉。 安顿了两天之后,我们三十期的开班典礼在三月二十六号早上的九点钟准时开始,由云珍老师主持,传说中的马哥、王老师、张sir、宗华老师纷纷登台致辞,分别从运维工…

    2018-03-26
  • linux入门基础命令总结

    命令基础

    2017-09-18
  • 第二周

    #第二周blog 作业 第二周blog 作业 1 目录管理命令:mkdir、rmdir mkdir命令 mkdir – make directories      mkdir [OPTION]… DIRECTORY…   &nbsp…

    Linux干货 2016-12-12
  • N22-第十一周作业

    1、详细描述一次加密通讯的过程,结合图示最佳。 (1)数字签名 A与B通信,B发给A一段数据,为了证明数据确实是B发送过来的,B首先会用单向加密算法从数据中提取一段特征码,然后用自己的私钥加密这段特征码和原始数据后,发送给A;A接受到数据,首先用B的公钥解密,获取到特征码和原始数据;然后用同样的单向加密算法从原始数据中提取一段特征码,与之前用公钥解密得到的特…

    Linux干货 2016-11-01

评论列表(1条)

  • renjin
    renjin 2017-04-21 09:57

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