码迷,mamicode.com
首页 > 其他好文 > 详细

脚本思想及其简单的技巧

时间:2016-03-21 19:55:35      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:

脚本思想及其简单的技巧
http://www.apelearn.com/bbs/forum.php?mod=viewthread&tid=7203&fromuid=4587
 
 
我通过一个简单的ping 脚本把知识点分享给大家。
 
先展示下这个脚本的效果
 
技术分享
 
我先把我学linux之前的脚本发出来
在把之后的脚本发出来做比较
最后 解析 每个知识点
-----------------------------------------
 
 
#! /bin/bash
## look exist ip
 
for sum in `seq 0 255`
  do
     ipsum=192.168.1.${sum}
     ping -c 1 -W 1 ${ipsum} &>/dev/null
     if [ "$?" == "0" ]
        then
             echo "$ipsum exist"
        else
             continue
     fi
  done
 
 
技术分享
 
这个脚本在我现在看来  十分的简陋不堪
1.只能查看192.168.1.0  网段ip
2.输出信息是否的难看     简直丑陋
3.ctrl+c 无法终止脚本 这很让人恼火
 
----------------------------------------------
 
 
这玩意  简直不堪入目
 
 
---------------------------------------
 
 
#! /bin/bash
cat << EOF
 
by jingwang at 2014,12,13
 
EOF
 
gate0=0
gate1=0
NET1="192.168.1.1"
NET0="192.168.0.1"
h=0
 
PING () {
if ping -c 1 -W 1 $PINGSUM &>/dev/null ;then
   return 0
else
   return 1
fi
}
 
PINGSUM () {
if [ $gate1 -eq 1 ] ;then
   M="${NET1%.*}"
elif [ $gate0 -eq 1 ];then
   M="${NET0%.*}"
fi
 
  for I in `seq 1 255`;do
   PINGSUM="$M.$I"
   PING
   if [ $? -eq 0 ] then
     INFO
     let h++
  done
echo -e "\033[32m$h hosts online\033[0m"
}
 
INFO () {
length=`stty -F /dev/console size | awk -F " " ‘{print $2}‘`
newlen=$[$length-8]
space=$[$newlen-${#PINGSUM}]
 
echo -n "$PINGSUM"
for sum in `seq 1 $space`;do
  echo -en " "
done
echo -e "\033[32m[up]\033[0m"
}
 
 
EXIT () {
echo -e "\033[31m    \n\neixiting....\033[0m" && exit 7
}
 
trap ‘EXIT‘ INT
 
echo -en "\033[33mplease your GATEWAY:\033[0m"
read N
 
while :;do
    case ${N:-noput} in
        noput) echo -e "\033[35mplease putin your GATEWAY OR quit\033[0m"
               ;; 
         quit) echo -e "\033[31m exiting....\033[0m" && exit
               ;; 
        $NET1) gate1=1 && break
               ;; 
        $NET0) gate0=1 && break
              ;; 
           *) echo -e "\033[31mInvlid argurment,please try putin GATEWAY OR quit\033[0m"
    esac
  echo -en "\033[33mplease your GATEWAY:\033[0m"
  read N
done
 
 
if [ $gate0 -eq 1 ] ;then
   PINGSUM
elif
   [ $gate1 -eq 1 ] ;then
   PINGSUM
fi
 
 
----------------------------------------------------
 
 
1该脚本能指定网段 192.168.1.0 192.168.0.0  我只添加了两种常用的网段  可扩展性强
2能随时 终止脚本 
3更美观
3能接收信号 实现ctrl+c 终止脚本
4统计在线主机
 
-------------------------------------------
 
随时终止  脚本
技术分享
----------------------------------------
 
 
脚本知识点
一,脚本结构   
 
二,脚本循环
 
三,函数
 
四,01开关思想
 
五,变量加减
 
六,特别的变量赋值
 
七,echo特殊用法
 
八,脚本返回值
 
九,信号捕捉
 
十,变量编辑
 
 
-----------------------------------------------------
 
技术分享
一,脚本结构
    if 。。。。;then
    fi 
    如果怎样就怎么样。     
    这种结构的脚本我很少这样写,一般写成 。。。。。 && 。。。。。
 
    if。。。。。;then
     。。。。。。。
    else
           。。。。。
     fi 
     如果怎样就怎么样,否则怎么样。
     这个脚本和上面一的结构一样,比较简单。 
     我一般写成    。。。。。 && 。。。。 ||
 
 
 
 
 
if 。。。。。then
   。。。。
elif
   。。。。。
fi
 
 
case VARNAME in
   *) ....
       ;;
    *)......
        ;;
esac
这两种结构  适合多种条件的     
if elif的适合多个不同的条件有不同的值
case 适合一个条件多种不同的值
我来罗列下  应用场景
 
---------------------------------------------------------------------
技术分享
二,脚本循环 
循环 不外乎  三种
for 。。。。。;do
。。。。
done
适合知道循环次数的场景
 
while 。。。。;do
。。。。。
done
条件为真循环  这种循环适合不知道循环次数的场景
需要有退出条件
 
until 。。。。。;do
。。。。。
done
和while类似   有点不同 条件为假时循环
 
 
 
while 的两个特殊用法
while :;do
.....
done    死循环
 
while read LINE ;do
cat $LINE
done < /etc/passwd
遍历文档
 
----------------------------------------------------------------------------
 
 
技术分享
 
 
 
三 函数
 
函数的作用多次引用  让脚本更加明了
对于我来说  可以少打很多重复的内容  让脚本写起来更轻松
技术分享
-----------------------------------------------------------
技术分享
 
四 0,1  开关思想
这个思想对于脚本的控制流程十分有用
掌握了此技能让你对程序的控制更加得心应手
 
-----------------------------------------------------------
技术分享
 
五,变量运算
脚本中可能会经常用到   注意下语法就够了
我知道的格式有四种   大家喜欢那种用那种
a=3 b=6
1,let c=$a=$b
2,c=$[$a+$b]
3,c=$(($a+$b))
4,c=`expr $a + $b`   不推荐此种方法   这个要注意每个字段间需要空格
 
 
-----------------------------------------------------------------
 
六,特变的变量赋值
有些时候变量没有值 或者值为空的时候脚本都会报错
这时候 就需要些特殊的变量赋值方法了
${parameter:-word}:如果parameter为空或未定义,则变量展开为“word”;否则,展开为parameter的值;
${parameter:+word}:如果parameter为空或未定义,不做任何操作;否则,则展开为“word”值;
${parameter:=word}:如果parameter为空或未定义,则变量展开为“word”,并将展开后的值赋值给parameter;
 
技术分享
--------------------------------------------------------------
 
七,脚本返回值
这个值对与我们十分重要 。编译源码时大家都经验,一次输入一大堆信息。
根本无法分源码是否编译成功   
这时候用echo $?  就能判断了  0 为成功 其他为失败
这里定义脚本的返回值也是遵照如此的
技术分享
---------------------------------------------------------------
 
八,echo的特殊用法
echo用好了 会让你的脚本看上去更加酷炫
 
echo -e ”\033[31m 。。。。。。\033[0m"  让脚本显示颜色更加醒目 更加酷炫
 
 
echo -n “               “   不添加换行符,能让下面一行并存为一行
我用此方法定义变量 显示颜色   更加醒目   
技术分享
------------------------------------------------------------
 
九,信号捕捉
不知道 你有没有发现 你写的脚本貌似不能像系统的二进制程序
支持 bg ctrl+c  等信号  或者说你根就不知道信号 
那么就kill -l 看看吧  kill 就是放送的命令控制程序
bash 自带命令 trap 就是补做信号的 
trap ‘执行的命令‘ 信号                 捕捉到该信号 执行单引号里的命令
技术分享
 
--------------------------------------------------------------
 
 
10,变量编辑
好吧  很多时候都可能用到变量编辑
a="/etc/passwd"
1,判断变量字符长度 cat "${#a}
我在这里用来计算 变量长度
 
cat “${a#*/}"         etc/passwd
cat  "${a##*/}        passwd
cat "${a%/*}"         /etc
cat  "${a%%/*}       
我在 这里用来截取网段     
 
技术分享
---------------------------------------------------------
 
 
#! /bin/bash
cat << EOF
 
by jingwang at 2014,12,13
 
EOF
 
green="\\033[32;1m"
orange="\\033[31;1m"
orange1="\\033[35;1m"
red="\\033[31;1m"
end="\\033[0;39m"
 
gate0=0
gate1=0
NET1="192.168.32.1"
NET0="192.168.0.1"
null="/dev/null"
num=0
 
PING () {
        if ping -c 1 -W 1 $1 &> $null ;then
           return 0
        else
           return 1
        fi
}
 
PINGSUM () {
        M="${1%.*}"
        for I in `seq 1 255`;do
                PING_IP="$M.$I"
                PING $PING_IP
                if [ $? -eq 0 ];then
                        INFO $PING_IP
                        ((num++))
                fi
        done
        echo -e "${green}$num hosts online${end}"
}
 
INFO () {
        # get null string
        length=`stty -F /dev/console size | awk ‘{print $2}‘`
        newlen=$[$length-8]
        space=$[$newlen-${#1}]
 
        echo -n "$1"
        for sum in `seq 1 $space`;do
                echo -en " "
        done
        echo -e "${green}[up]${end}"
}
 
EXIT () {
        echo -e "${orange}    \n\neixiting....${end}" && exit 7
}
 
trap ‘EXIT‘ INT
 
while :;do
 
        echo -en "\033[33mplease your GATEWAY: \033[0m"
        read GATEWAY
 
    case ${GATEWAY:-noput} in
        noput)
                        echo -e "${orange1}mplease putin your GATEWAY OR quit${end}"
                        ;; 
         quit)
                        echo -e "${orange} exiting....${end}" && exit
                        ;; 
           *)
                        if ! PING $GATEWAY ;then
                                echo -e "\033[31mInvlid argurment,please try putin GATEWAY OR quit\033[0m"
                        else
                                PINGSUM $GATEWAY
                        fi
                        ;;
    esac
 
done
 
 
稍稍改了一下
 
noreliang 发表于 2015-9-1 01:29
#! /bin/bash
cat  $null ;then
           return 0
 
这个 字体颜色 一直没有注意  有颜色重复
你这一改  倒是提醒我了   谢谢 指正
 
 
---------------------------------------------------------------------------
 
 
 
 
脚本后面应该加上exit 0
 
 
--------------------------------------------------------------

脚本思想及其简单的技巧

标签:

原文地址:http://www.cnblogs.com/MYSQLZOUQI/p/5303014.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!