shell 摘要

判断路径是不是非空

path=/server/backup

find ${path:/tmp} -name "*.tar.gz"   -type f|xargs rm -f

rm -rf ${path}

计算变量长度

seq -s "100"  100 以空格为分隔符打出来100个数字,如果不加s,会以回车为分隔符

3个方法实现同样的功能

echo $(expr length "$chars")   ==效率最高

ech0 ${#chars}

ech0 $chars |wc -m

变量的数值计算

(())  常用的方法之一

执行简单的整数运算,只需将特定的算术表达式"$(("和"))" 括起

& 位的and

echo $((a+=1)) a=a+1

a++  先输出a的值,然后计算自增

变量在前,先输出变量值,变量在后,就是先运算后输出变量的值

1,100的计算  echo $((100*(100+1)/2))

#/bin/sh

i=1

while a<=100

do

i=1,(i++)

done

ech0 $i

实现加减乘除等功能的计算器,通过命令行传参的方式实现

#/bin/sh

echo $(($1$2$3))

let赋值表达式

expr 2 + 2 计算功能

expr 判断变量是否为整数

bc命令 主要用于小数

shell 变量的输入

语法格式 read 参数 变量名 -p设置提示信息 -t 设置输入等待的时间

加减乘除的脚步改成通过read方式读入整数变量

#/bin/sh

while true

do

read -t 10 -p "pls input two number:"  a b

expr $a +0 >/dev/null 2>&1

[ $? -ne 0 ] && continue

expr $b +0 >/dev/null 2>&1

[ $? -ne 0 ] && continue ||break

done

ech0 “a-b=$(( $a-$b ))”

ech0 “a+b =$(( $a+$b ))"

2

#/bin/sh

a="$1"

b="$2"

Usage () {

ech0 "Usage:sh $0 numl num2"

exit 1

}

if [ $# -ne 2 ];then

Usage

fi

1.3 条件测试

格式 [<测试表达式>] && || > < 等操作符可以用应用于[[]] 中

=和!=在[]中使用不需要转义

"-a" "-o" 逻辑操作符号用于[]中使用

"&&"  "||" 逻辑操作符号用于[[]]中使用

判断条件后面执行多条命令 用{} 和()

[2 -ne 2] || {echo " im 1 " ; ech0 " im2 ";exit 1 ;}

1.3.2.4 test命令测试字符串

test -z "file1" ||echo 0=== [[-z "$file1 "]] ||echo 0

制作单级及多级菜单,  cat 多行的输出

用了函数

cat menu.sh

单个菜单

menu() {

cat <<END

1.[ install lamp1]

2.[ install lamp2]

3.[ install lamp3]

please input the num that you want:

END

}

menu

read a

echo ”you selected $a "

多级菜单

cat <<END

1.[ install lamp1]

2.[ install lamp2]

3.[ install lamp3]

please input the num that you want:

END

read a

[ $a -eq 1 ] && {

cat << END

[ install lamp1]

[ install lamp1]

[ install lamp1]

END

}

read b

echo "you want to install $b.apache."

1.4 分支与循环结构

if 条件句

单分支结构语法

if [条件]

then

指令

fi

单分支if条件语句整数比较大小

#/bin/sh

a=12

b=13

if [$a -gt $b ]

then echo  "$a <=$b "

fi

查看空闲内存

free -m |awk ‘/buffers\//{print $NF} ‘

双分支结构

if [条件]

then 指令

else 指令

fi

多分支结构

if [条件]

then 指令

elif 条件

then 指令

else 指令

fi

判断字符串是否为数字的方法  -n 非空字符串

[ -n "` echo 22 |sed ‘ s/[0-9]//g‘`" ] && echo 1 ||echo 0 第一个参数必须为数字

[ -n "` echo 22 |sed ‘ s/[0-9]//g‘`" ] && exit 1 参数必须为数字

[ -z "` echo 22 |sed ‘ s/[0-9]//g‘`" ] && echo 1 ||echo 0 -- 长度为0

expr 计算判断

expr $1+0 >/dev/null2>&1

[ $? -eq 0 ] && echo int

监控mysql服务的方案

方法1  netstat -lnt |grep 3306 ===不完美

netstat -lnt |grep 3306 |awk -F  ‘[ :]+‘ ‘{ print $5 }‘

#!/bin/sh

PORT=`netstat -lnt |grep 3306 |awk -F  ‘[ :]+‘ ‘{ print $5 }‘ `

if [$PORT -eq 3306 ] ===最好是字符串 [ "$PORT" != "3306" ]

then

echo "db is runing"

else

/data/3306/mysql restart  ===根据实际情况来写

fi

方法2 netstat -lnt |grep 3306|wc -l

#!/bin/sh

PORTnum=`netstat -lnt |grep 3306 |wc -l `

if [$PORTnum -eq 1 ]

then

echo "db is runing"

else

/data/3306/mysql restart  ===根据实际情况来写

fi

方法3 如果mysql端口和进程同时存在,即认为mysql服务正常

netstat -lntup |grep mysql |wc -l

ps -ef |grep mysqld |grep -v grep |wc -l

杀掉mysqld的循环

while true

do

killall mysqld > /dev/null 2>&1

[$? -ne 0] &&break

sleep 1

done

方法4 模拟web服务器,通过mysql账户连接mysql,然后根据返回命令状态或者内容确认mysql是否正常

例如  mysql -uroot -p‘oldboy‘ -S /data/3306/mysql.sock -ech0 -e  "selecte version();" >&/dev/null

然后用 $? -eq 0 来判断,0是真,1位假

如果=0 提示数据库正在运行,如果不=0 杀进程,然后启动进程

异地连接的情况下

使用转义的比较符号

if [$? -eq 0  ] && [  $d -eq 2 ] && [$e -lt 5]

if [$? -eq 0  ] || [  $d -eq 2 ] || [$e -lt 5]

监控apache 端口监控

netstat -lnt |grep 80 |awk -F  ‘[ :]+‘ ‘{ print $5 }‘

#!/bin/sh

PORT=`netstat -lnt |grep 80 |awk -F  ‘[ :]+‘ ‘{ print $5 }‘ `

if [$PORT -eq 80 ] ===最好是字符串 [ "$PORT" != "3306" ]

then

echo "apache is runing"

else

/data/3306/mysql restart  ===根据实际情况来写

fi

监控远程apche

使用 nmap ip -p 80 |grep open |wc -l

通过wget 判断 ..wget -T 10 -q --spider  http://10.0.0.9  >&/dev/null

通过curl -s http://8.8.8.8  >&/dev/null

curl -I www.baidu.com 获取200的状态码

curl -I -s baidu.com |head -1 |cut -d " " -f2

加载函数库

cat check_web.sh

#!/bin/sh

[ -f /etc/init.d/functions ] && ./etc/init.d/functions ||exit 1

httpCode=`curl -I -s baidu.com |head -1 |cut -d " " -f2`

if [ "$httpCode" == "200"];then

action "nginx is runing." /bin/true

else

action "nginx is not runing." /bin/false

sleep 1

/appliaction/nginx/sbin/nginx && \

action "nginx is started." /bin/true

fi

传参的方法

#!/bin/sh

[ -f /etc/init.d/functions ] && ./etc/init.d/functions ||exit 1

if [$# -ne 1];then

echo "Usage:$0 argv"

exit 1

fi

httpCode=`curl -I -s $1 |head -1 |cut -d " " -f2`

if [ "$httpCode" == "200"];then

action "nginx is runing." /bin/true

else

action "nginx is not runing." /bin/false

sleep 1

/appliaction/nginx/sbin/nginx && \

action "nginx is started." /bin/true

fi

传参判断ip 和端口

#!/bin/sh

if [$# -ne 2];then

echo "Usage:$0 ip port"

exit 1

fi

HttpPortNum=`namp $1 -p $2 |grep open |grep -v grep |wc -l`

if [ $HttpPortNum -eq 1 ];then

echo "$1 $2 is open."

else

echo "$1 $2 is closed."

fi

查看远端端口是否开启

echo -e "\n" |telnet baidu.com 80 |grep Connected |wc -l

namp   www.baidu.com -p 80

nc -w 5 www.baidu.com 80 && echo ok

case 结构条件句

case "字符串变量" in

值1 ) 指令

;;

值2 ) 指令

;;

*) 指令

esac

利用case语句开发apache/nginx HTTP服务启动脚本 ,可参看系统的portmap脚本

centos里面不一样,百度之

#!/bin/sh

httpd="启动路径 /appliaction/nginx/sbin/nginx"

./etc/init.d/functions

case "$1"  in

start )

$httpd start >& /dev/null

[ $? -eq 0 ] && action "httpd is started " /bin/true ||\

action action "httpd is started " /bin/false

;;

stop )

$httpd stop >& /dev/null

[ $? -eq 0 ] && action "httpd is stoped " /bin/true ||\

action action "httpd is stoped " /bin/false

;;

restart )

$httpd restart >& /dev/null

[ $? -eq 0 ] && action "httpd is restarted " /bin/true ||\

action action "httpd is restarted " /bin/false

;;

* )

echo "Usage:$0 {start|stop|restart}"

exit

;;

esac

脚本添加到服务 为开机启动,即可以使用service命令来使用 chkconfig

需要学习的规范脚本

/etc/init.d/functions

/etc/rc.sysinit

/etc/init.d/nfs

/etc/init.d/httpd

mysql 多实例的启动

启动mysql服务器:./mysqld_safe --defaults-file=/etc/my.cnf --user=root 2>&1 > /dev/null &

还可以通过判断mysql.sock存在与否

比如/var/lib/mysql/mysql.sock

当型循环和直到新循环

while do 指令 done

until do 指令 done

whlie true 表示条件为真,会一直执行下去,也可以成为守护进程

usleep 微秒的意思

后台执行的程序,掉到前台用fg ,bg后台, jobs

ctrl c 停止  ctrl z 暂停

whlie语句计算1到100之和

#!/bin/sh

i=1

sum=0

while

(( i < = 100)) do

((sum=sum+i))

((i++))

done

[ -n "$sum" ] $$ printf "totalsum is :$sum\n"

或者i=100 ((sum=i*(i+1)/2)) 效率高

竖列打印10个数字 10 9 8... 1

#!/bin/sh

i=10

while ((i>0))   =====while [[$i > 0 ]]

do

ech0  $i

((i--))

done

分析apache日志,计算所有行的日志元素的访问总和

第八列就是大小

echo `awk ‘{print $ 10 }‘ access_2016.log |grep -v -|tr "\n" "+"  |sed ’s#117+#117#g’` |bc

把换行替换为+,然后用sed替换+,以117+结尾的情况下 最后 用bc计算

sum=0

whlie read line

do

size=`echo $line |awk ‘{ print $10 }‘`

[ "$size" == "-" ] && continue

((sum=sum+$size))

done <access_2016.log ==结尾读取日志

开头读取日志

exec <access_2016.log

for 循环语句

echo 10.0.0.{5..1}

seq -s " " 5 -1 1  ====从5打到1

目录 获取  ls -F |grep /

for num in  `ls -F |grep /`

do

echo $num

done

ls *.jpg |awk -F ‘分隔符‘ ‘{print $0 }‘

99乘法表

for i in {1..9}

do

for ((j=1;j<=9;j++))

do

echo -n "$j*$i=$(($j*$i)) "

if [ $j -ge $i ]

then

echo -e ‘\n‘

break

fi

done

done

LANG=en

chkconfig --list |grep 3:on|awk ‘{print $1}‘ ===开机启动

查询出来开机的,先全部关闭,然后再开启需要的

for oldboy in`chkconfig --list |grep 3:on|awk ‘{print $1}‘`

do

chkconfig --lever 3 $oldboy off

done

for oldboy in cron network syslog sshd

do

chkconfig --lever 3 $oldboy on

done

seq 有个步长的参数  seq 1 3 10  3是步长

seq -w 100

随机数 echo $RANDOM   echo $(date +%N)  openssl rand --base64 8|md5sum   mkpasswd 8|md5sum

echo $(date +%N)$RANDOM|md5sum|cut -c 2-9

break continue exit 的例子

break n n表示跳出循环的层数,如果省略n表示跳出整个循环

continue  忽略本次循环的,进入循环的下一次循环

exit 不会执行循环下面的脚步

shell 函数

函数名(){

指令...

return n

}

执行的时候,直接执行函数名即可 $0比较特殊

函数传参转成脚本命令行传参 ,注意2个$1

#/bin/sh

if [ $# -ne 1 ]

then

echo "error" && exit 1$2$3

fi

functions Check_Url () {

curl -I -s $1 |head -1 && return 0||return 1$2$3

}

Check_Url $1

函数参考/etc/portmap,httpd 服务启动脚本

批量检查web url 并通过手机邮件报警

检查系统是否优化之一

# Source function library.-

. /etc/init.d/functions.

if

.grep 18030 /etc/sysconfig/il8njlwc -1‘ -eq 1 ] N

then"

action "/etc/sysconfig/il8n" /bin/true"

else.

action "/etc/sysconfig/il8n" /bin/false"

fi.

export LANG=en-

if [ ‘grep 65535 /etc/security/limits.conflwc -1‘ -eq 1 ]

then"

action "/etc/security/limits.conf" /bin/true.

else.

action "/etc/security/limits.conf" /bin/false.

fi

,1.7.1数组介绍、

数组就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集

合。这个名字成为数组名,编号成为下标。组成数组的各个变量成为数组的分量,也称为

数组的元素,有时也称为下标变量。、

如果有过用其它语言编程的经历,那么想必会熟悉数组的概念。由于有了数组,可以

用相同名字引用一系列变量,并用数字(索引)来识别它们。在许多场合,使用数组可以

缩短和简化程序,因为可以利用索引值设计一个循环,高效处理多种情况。杏

http://baike.baidu. com/view/209670.htm,

数组定义

array=(value1 value2 ...)

获取数组的长度

[[email protected] "I# echo ${#array[@]}

3

[[email protected] "]# echo ${#array[*]}

3

把#去掉可以获得整个数组内容 echo ${array[*]}

数组实例

[[email protected] scripts]# cat arr01_sh

array=(

oldboy

zhangyue

zhangyang

for ((i=0; i<${#array[*]}; i++))

do

echo ‘This is num $i,then content is ${array[$i]}‘

done

echo ----------------------

echo  array len:${#array[*]}‘

function check url(){

for  ((i=0;i<${#url_list[*]};  i++))

do

judge=($(curl -I -s --connect-timeout 2 ${url_list[$i]}head -1

if [ "${judge[1]}"=="200" -a "${judge[2]}"=="OK" ];then

action ‘${url-list[$i]}  is successful /bin/true

else

action ‘${url-list[$i]}  is failure /bin/false

fi

done

bash命令参数调色

-n -v -x  最后一个很有用,追踪脚步

1.8.2.6扩展内容shell调试小结:、

0)直接执行脚本根据报错来调试。、

1)要记得首先用dos2unix处理脚本、

2) sh -x/-n调试整个脚本、

3) set -x和set +x调试部分脚本(脚本中设置)、

4) echo内容输出然后;exit退出的方式,一步步跟踪脚本。、

5)最关键的是编码习惯,将错误扼杀在萌芽之中,降低减轻调试负担。

时间: 2024-10-24 21:18:33

shell 摘要的相关文章

Linux的Shell编程——认识BATH这个Shell

Linux的Shell编程——认识BATH这个Shell 摘要:本文主要了解了Linux系统中的Shell,以及什么是BATH. 什么是Shell Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动.挂起.停止甚至编写一些程序. Shell处在内核与外层应用程序之间,起着协调用户与系统的一致性.在用户与系统之间进行交互的作用.Shell接收用户输入的命令,并把用户的命令从类似abed的ASCII码解释为类似0101的机

Shell实用功能(摘要)

1. 命令历史记录:    通过按向上方向键,可以向后遍历最近在控制台下输入的命令:通过按向下方向键,可以向前遍历最近在控制台下输入的命令.    与“shift”键连用的话,还可以遍历以往在该控制台中的输出.也可以编辑旧的命令,然后在运行. 2. [!$]:重复前一个命令最后的参数      例:[~]# cd /root        [~]# cd !$        [~]# cd /root 3.命令的排列:(1)使用排列“:”同时执行两个命令                    

a byte of vim -- 学习摘要

说在前面的话 -- a byte of vim 是我见过的最介绍vim 最好的书,想了解强大的vim的人,或者是已经在使用vim而打算进一步了解的人,我感觉都应该看看这个,内容精炼但涵盖很广,--"vim为什么这么强大",当看完这本书时,我想你就能完全的了解了--此外,本书是一英文版,但很简单,学语言的同时学习英语很不多-- 附上最新版的下载链接 http://download.csdn.net/detail/wuzhimang/8933257  ,当然上官网才是硬道理 以下是自己针对

Linux网络配置及SSH和Shell基础

Linux网络配置及SSH和Shell基础 一.Linux网络配置     ifconfig命令被用于配置和显示Linux内核中网络接口的网络参数.用ifconfig命令配置的网卡信息,在网卡重启后机器重启后,配置就不存在.要想将上述的配置信息永远的存的电脑里,那就要修改网卡的配置文件了. 二.hosts文件的作用及修改主机名      Hosts : The static table lookup for host name(主机名查询静态表)       Linux 的/etc/hosts是

Shell脚本学习指南 [ 第三、四章 ] 查找与替换、文本处理工具

摘要:第三章讨论的是编写Shell脚本时经常用到的两个基本操作.第四章总共介绍了约30种处理文本文件的好用工具. 第三章 查找与替换 概括:本章讨论的是编写Shell脚本时经常用到的两个基本操作:文本查找.文本替换. 3.1  查找文本 如需从输入的数据文件中取出特定的文本行,主要的工具为grep程序.POSIX采用三种不同grep变体:grep.egrep.fgrep整合为单个版本,通过不同的选项,分别提供这三种行为模式.who | grep -F root上面使用-F选项,以查找固定字符串r

使用Shell脚本对Linux系统和进程资源进行监控

ShellLinux脚本 摘要:Shell语言对于接触Linux的人来说都比较熟悉,它是系统的用户界面,提供了用户与内核进行交互操作的一种接口.本文我们以Bash做为实例总结了使用Shell对系统和进程资源进行监控的一些内容,希望对您能有帮助. Shell语言对于接触Linux的人来说都比较熟悉,它是系统的用户界面,提供了用户与内核进行交互操作的一种接口.它接收用户输入的命 令并把它送入内核去执行.实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核.它没有一般编程语言的“

Linux 常用命令解析及Bash Shell脚本用法示例

 摘要 Linux 命令是基于文本格式输入输出的一种程序,按照Unix哲学中强调的程序功能简单,输入宽松,输出严谨,各种程序组合可以具有更强大的功能,而具有这种灵活性的主要原因是Linux规定程序的输入输出必须坚持文件流格式,即文本格式,而这就是Linux系统的核心之一. 对于Bash,即Shell的一种,为现在主流Linux发行版本默认的命令行解释器,是一种功能强大的工具,可以实现对Linux支持的程序命令的组合,从而实现强大功能.类似于Window系统的bat文件,Bash具有更为强大的

37条常用Linux Shell命令组合

序号 任务 命令组合 1 删除0字节文件 find . -type f -size 0 -exec rm -rf {} \; find . type f -size 0 -delete 2 查看进程,按内存从大到小排列 ps -e -o “%C : %p : %z : %a”|sort -k5 -nr 3 按cpu利用率从大到小排列 ps -e -o “%C : %p : %z : %a”|sort -nr 4 打印说cache里的URL grep -r -a jpg /data/cache/*

Unix Shell_Oracle Erp和其他系统Interface资料传输通过Shell进行控制(案例)(架构)

2014-06-26 BaoXinjian 一.摘要 当不同的系统资料进行交换,可以很多种方式,如MQ,DBLink 当接触一些信息安全比较严的项目,很多公司都是采用unix shell直接进行抛转文件的方式进行 使用unix shell抛传文件的时,就必须区分哪些文件已被读取,哪些文件未被读取,读取成功之后文件如何处理,读取失败后的文件如何处理 之前做的一个保险项目,其处理不同系统之间所有的interface data资料,都是通过unix shell去控制,其安全性会比较高 Step1. 通