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 入门(二)

    又一个周的时间过去了,觉得时间过的好快的呢,大概是因为沉迷于学习吧(害羞脸),在这一周里学习了不少东西呢,下面就来总结一下吧 (1)    cp 复制 如果只是单纯的敲cp复制文件而不加任何选项的时候,如果目的目录文件已经存在,就会直接覆盖,而不会出现任何提示信息,而当在实际操作时,就算不加 –i选项,也会提示要不要覆盖文件 原…

    2017-07-22
  • 心清冷其若冰,志皎洁其若云

    第一篇,当做测试也做开始。 心清冷其若冰,志皎洁其若云。 这闹哄哄的人间啊,仿佛是一堆杂货。无奇不有,无所不能。情感,城市,人际。每天走在这杂乱里,需要有一颗清澈而安静的心,来面对。 会累的。就算是拥有了许多,也是会累的。偶尔,我们也会在深夜里泪流满面吧。偶尔,我们也会心烦意乱的不知所措吧。 太多欲望的人间,热闹的上演着各种剧本。太多空洞的灵魂,喧嚣着各种声…

    Linux干货 2016-11-28
  • 马哥教育网络班19期+第九周课程练习

    1、写一个脚本,判断当前系统上所有用户的shell是否为可登录shell(即用户的shell不是/sbin/nologin),分别这两类用户的个数,通过字符串比较来实现。 #!/bin/bash for user_shell in `awk -F: '{print $7}'&nbsp…

    Linux干货 2016-07-01
  • linux小小小入门。

      ❀用户登录:     ❤root用户 这是一个特殊的管理账户,也被称为超级账户,root已经接近完整的系统控制。但是对系统的损害有非常广泛的能力。(一般情况下不会登录root)     ❤普通用户 权限有限,损害能力较小。 ❀终端terminal:     ❤设备终端 键盘,鼠标,显示器     &#x…

    Linux干货 2018-03-26
  • 几种常见的linux发行版

    redhat :Red Hat Enterprise Linux,是一个非常强大的服务器系统,超强的生命周期支持10年以上的升级和技术支持同样费用也非常可观8千多一个授权一年。如果没有license是不能在线升级系统,和通过yum安装软件。而centos则没有这些限制,所以centos是非常收欢迎的系统。 centos:是一个社区企业系操系统,其基础架构与r…

    Linux干货 2017-08-19

评论列表(1条)

  • renjin
    renjin 2017-04-21 09:57

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