脚本思想及其简单的技巧

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

--------------------------------------------------------------

时间: 2024-08-24 05:17:39

脚本思想及其简单的技巧的相关文章

更快学习 JS 的 6 个简单思维技巧

当人们尝试学习 JavaScript , 或者其他编程技术的时候,常常会遇到同样的挑战: 有些概念容易混淆,特别是当你学习过其他语言的时候. 很难找到学习的时间(有时候是动力). 一旦当你理解了一些东西的时候,却很容易再一次忘记. 可以使用的工具甚多且经常变化,所以不知道从哪里开始入手. 幸运的是,这些挑战最终都可以被战胜.在这篇文章里,我将介绍 6 个思维技巧来帮你更快的学习 JavaScript ,让你成为一个更快乐更多产的程序员. 1.不要让将来的决定阻止你进步 对于很多学习 JavaSc

Hibernate实体映射文件多对多等关系简单应用技巧

第一步,写注释: <!--xx属性,本类与Yy(类)的多对一 --> <!--xx属性,本类与Yy(类)的一对多 --> <!--xx属性,本类与Yy(类)的多对多 --> <!--xx属性,本类与Yy(类)的一对一 --> 第二部,拷模版 <!--xx属性,本类与Yy(类)的多对一 --> <many-to-one name="" class="" column="">&l

shell脚本基础的简单介绍与简单应用

Shell脚本是Linux中很重要的一种"程序". 什么shell脚本? shell脚本是提前设计的可执行语句,用来完成特定任务的文件. Shell脚本可分为交互式和非交互式 交互式:指脚本在运行时,需要一些人为的参与,比如,键盘输入数据,确认选项等.因为有人为的参与,所以运行时更加智能化,但是同时效率会降低 非交互式:指脚本运行时不需要人为干预,批量执行,效率高,但提高智能化难度大 2  shell脚本的规范格式 #!环境申明 # 注释文本 可执行代码 以上就是shell脚本的规范格

Linux初级脚本:一个简单的日志核查脚本

领导交代任务,要每天检查定时任务有没有执行.虽然简单但太繁琐,写了个脚本偷懒.顺便学习几个bash知识点.温故知新吧. #检查前一天的crontab日志有没有执行JOB1和JOB2两个定时任务 #检查数据库中的数据是否及时清理完 #!/bin/bashdeclare -i DB_STATUS=0 #由于日志日期只有月.日有效,时间不作判断,因此使用date -d参数格式化时间输出. #由于date命令用于grep,中间带空格,无法直接拼接,必须先赋予一个变量,然后用双引号标注该变量作为grep参

键盘快速启动工具Launchy的简单使用技巧

打开电脑面对林林总总的图标,找到对应的程序,快速启动显得尤为重要.这样有利于提高我们的效率. 好了,直接上图: 就是这款小巧的工具,界面如上. 接下来介绍这款工具的使用技巧. 1.安装成功后:打开工具之后,我们可以编辑热键,按照我们个人的操作习惯,设置自己熟悉的热键.工具默认热键是ALT+SPACE(空格键) 以后每次打开工具就很方便了.用热键直接呼出界面. 设置热键界面如下: 2.常规界面一些选项的设置,按照自己的需求来 3.设置调出界面的样式,工具提供的.看个人喜好了. 4.面板上目录选项的

状态机(程序设计思想)简单介绍

本文出处:http://blog.csdn.net/eager7/article/details/8517827 状态机思路在单片机程序设计中的应用 状态机的概念状态机是软件编程中的一个重要概念.比这个概念更重要的是对它的灵活应用.在一个思路清晰而且高效的程序中,必然有状态机的身影浮现. 比如说一个按键命令解析程序,就可以被看做状态机:本来在A状态下,触发一个按键后切换到了B状态:再触发另一个键后切换到C状态,或者返回到A状态.这就是最简单的按键状态机例子.实际的按键解析程序会比这更复杂些,但这

perl相关的简单调试技巧

初学perl语言,最先接触的不是它的语法,而是它的调试方法,当时是由于一个perl script生成的html页面无法正常显示,让我找出问题的原因,然后修复,当时是第一次接触perl,完全没有任何了解,就凭着学了几句在Teriminal中可以使用的调试命令,很快解决了问题,所以,想简单的调试一下perl还是很容易的,只要用会以下几句:perl -d filename这句是进入perl的调试命令 然后屏幕上会出现如下字样:Enter h or `h h' for help, or `man per

卷积神经网络_(3)_几种简单训练技巧

下面来介绍几种简单的训练技巧: 1.首先说一下filter(感受野)的概念:感受野的大小即特征图中的某一单元是从原始输入图像中多大的一块区域中提取的特征: 如上图,第一次卷积后得到的特征图中,每一个小单元的感受野大小为3*3,而第二次卷积后特征图中的每一个小单元对应的感受野大小为5*5,以此类推,如果 用三层3*3的filter,那么最后一层特征图中每一个小单元的感受野大小即为7*7. 同时我们可以推论:卷积层数越多,越后面的特征图中的每个单元的感受野大小就越大,特征提取的效果就越好. 这时我们

MVC设计模式思想及简单实现

一.什么是MVC MVC即Model-View-Controller(模型-视图-控制器)是一种软件设计模式,最早出现在Smalltalk语言中,后被Sun公司推荐为Java EE平台的设计模式. MVC把应用程序分成了上面3个核心模块,这3个模块又可被称为业务层-视图层-控制层.顾名思义,它们三者在应用程序中的主要作用如下: 业务层:负责实现应用程序的业务逻辑,封装有各种对数据的处理方法.它不关心它会如何被视图层显示或被控制器调用,它只接受数据并处理,然后返回一个结果. 视图层:负责应用程序对