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

相关推荐

  • 前三天基础-Linux文件系统概论

    Linux之我见     在2016农历丙申年2016年猴年,对于小白的我来说接触到了江湖流传的武功秘籍之-Linux心法,第一次接触到命令行,知道在键盘上随便敲击命令就可以满屏跑数据,就像看过的美国大片里黑客帝国里面的画面,感觉学会好后可以装逼了,废话不多说了,允许在下斗胆介绍Linux文件系统。     &nbsp…

    Linux干货 2016-03-24
  • 正则表达式和变量写脚本

    #!/bin/bash 检查系统所有用户的shell是否为bash? 注释:用grep查找是否有此类用户,如果有则为真,则$?必然为0;显示的passwd结果对我们没意义,所以重定向到空。  grep “\bbash\b$” /etc/passwd &> /dev/null  A=`echo $?` …

    Linux干货 2017-04-16
  • yum软件管理使用详解

    yum介绍 yum客户端的使用 配置文件项作说明: 案例repo配置文件。 创建yum源命令(yum-config-manager) yum list相关命令 yum安装 yum更新和升级 yum查找和显示 yum删除程序 查看仓库 实战演练本地yum仓库(光盘) YUM内置变量 创建YUM仓库(http) yum介绍 yum命令是在Fedora和RedHa…

    Linux干货 2016-09-06
  • 马哥教育网络班21期+第8周课程练习

    1、请描述网桥、集线器、二层交换机、三层交换机、路由器的功能、使用场景与区别。 集线器:工作在物理层,对信号作放大处理,转发比特流,所有端口都是共享带宽都是一个冲突域,使用在小型局域网内。 网桥:早期的二层数据链路层设备,可以建立和维护MAC地址表,独享带宽,每个端口是一个冲突域,使用在小型局域网内。 交换机:工作在数据链路层,可以学习和维护MAC地址,之后…

    Linux干货 2016-08-05
  • 小练习题。【第四周】

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其他用户均没有任何访问权限。 home]# chmod g-rwx,o-rwx -R tuser1 2、编辑/etc/group文件,添加组hadoop。 /]# vim /etc/group …

    Linux干货 2016-11-26
  • N26-第七周作业-邢岩

    马哥门徒-N26-邢岩      今天看了一本书《运维前线:一线运维专家的运维方法、技巧与实践》,有一张运维全平台规划体系如下:      看完这张图,瞬间觉得自动化运维真的是很庞大精深,我只是在运维这片海洋的岸边,刚刚迈入一只脚步而已,究竟什么是山,什么是水,还不得而知。就让我化身一条小鱼,在这片…

    2017-03-11

评论列表(1条)

  • renjin
    renjin 2017-04-21 09:57

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