首页 > 代码库 > Linux Shell编程讲解

Linux Shell编程讲解

                 Shell编程总结

Seq命令总结用法:

选项:

-f, --format=格式使用printf 样式的浮点格式

-s, --separator=字符串使用指定字符串分隔数字(默认使用:\n)

-w, --equal-width 在列前添加0 使得宽度相同实例 

来自: http://man.linuxde.net/seq

1.横着打印数字

 技术分享

2.竖着打印数字:

 技术分享

技术分享

技术分享

3.用seq输出,交给bc命令计算

技术分享

注:可以计算加减乘除,浮点数,进制转换

Echo命令用法总结:

echo 选项列表

选项

描述

-n

不输出末尾的换行符。

-e

启用反斜线转义。

\b

退格

\\

反斜线

\n

新行

\r

回车

\t

水平制表符

\v

垂直制表符

技术分享

技术分享

注:echo-e启用转义字符反斜线的编译器,上面命令启用-e  \t显示为水平制表符

技术分享

注:echo-e启用转义字符反斜线的编译器,上面命令启用-e  \v显示为垂直制表符

技术分享

注:echo-e启用转义字符反斜线的编译器,上面命令启用-e  \n\t显示效果

技术分享

Echo命令和大括号混合使用方法

技术分享

curl命令用法总结:

curl的选项功能:

不带任何参数时 curl 将返回指定url中的数据并打印在屏幕上

-u 使用用户名和密码登陆。如curl -uname:passwd URL

-b/--cookie  <name=data>   向服务器提交cookie,若无=则name视为文件名,例如:curl -b cookie.txt www.jbxue.com

-o out  将指定curl返回保存为out文件,内容从html/jpg到各种MIME类型文件。如curl -o page.html URL

-d <key=value>  向服务器POST表单数据 例如:curl -d "order=111&count=2" http://www.jbxue.com/buy

-A/--user-agent  <ua>  指定发送请求的用户代理,例如:curl -A My-Agent/1.0.0 www.jbxue.com 

-x  ip:port 指定使用的http代理,例如:curl -x 192.168.1.1:8080 www.jbxue.com

-D head.txt  将服务器的返回的header保存为文件,头部的cookie也可被保存,例如:curl -D header.txt www.jbxue.com  

如果希望从本地文件中获取表单数据,则在文件名前加@ ,例如:curl -d @data.xml http://www.jbxue.com

若希望从标准输入获取则用 curl -d "name=username&passwd=pwd" http://www.jbxue.com

-L 当页面有跳转的时候,输出跳转到的页面

-I  header信息  当有跳转时,可以通过 curl -L -I URL|grep Location 来确定跳转到的新url地址

-c <file>保存服务器的cookie文件

-e url  设置引用头的值

-T localfile  向服务器PUT文件 例如:curl -T 1.mp3  www.jbxue.com/upload.php

-F <key=value>向服务器POST表单,例如:curl -F "web=@index.html;type=text/html" url.com

-E cert.pem  指定本地证书

-H <header:value>  为HTTP请求设置任意header及值。如curl -H "Connection:keep-alive" http://www.jbxue.com

-X/--request method 用户定义的HTTP请求方法名如 curl -X GET www.baidu.com

--compressed 采用压缩方式接收返回数据

--connect-timeout <s>设置超时时间

-v 详细输出,包含请求和响应的首部

--retry num

--retry timeo 指定重试的次数和间隔

--tcp-nodelay 打开TCP_NODELAY选项  不进行捎带确认

-O  按服务器上的名称保存下载的文件

-r/--range  from-to 下载指定range内的数据

-C 在保存文件时进行续传

Wget命令总结:

例子:

wget http://cn.wordpress.org/wordpress-3.1-zh_CN.zip 

参考网址:http://www.jb51.net/LINUXjishu/86326.html

awk命令总结:

awk -F "|" ‘{print $1}‘   file 按照新的分隔符“|”进行操作。

命令参考地址:

http://www.cnblogs.com/repository/archive/2011/05/13/2045927.html

用while循环批量创建用户:

Nmap命令总结:

nmap 192.168.0.101使用ip地址扫描打开的端口

命令参考地址:

http://www.cnblogs.com/hongfei/p/3801357.html

sed命令详解:

sed轻量级的流编辑器。sed主要是用来将数据进行选取,替换

删除,新增的命令

sed命令格式: sed [选项]-‘[动作]‘文件名

选项:

-n       加入此选项,则会吧经过sed命令处理的行输出的屏幕上

-e      允许对输入数据应用多条sed命令编辑

-i      用sed的修改结果直接下该读取数据的文件,而不是由屏幕输出

动作:

a \:    追加  sed -i ‘1a xixi‘ /tmp/haha 在第一行后面追加xixi

c \:    行替换 sed -i ‘2c haha ‘/etc/httpd/conf/httpd.conf 把第二行的内容替换为haha

i \:   插入 sed -i ‘4i haha‘ /tmp/haha 在第四行插入haha

d  :   删除 sed -i ‘4d ‘ /tmp/haha 删除第四行的haha

p  :   打印,输出指定的行  sed -n ‘2p‘ /tmp/haha 打印出第二行,输出到屏幕

s  :   字串替换格式为: 行范围s/旧字串/新字串/g  sed -i ‘1s/2/3/g‘ 1.sh   将第一行的2换为3

sort /etc/passwd    排序命令

sort -r /etc/passwd   取反

unip去重命令:

其选项含义:
-u 只显示不重复行。
-d 只显示有重复数据行,每种重复行只显示其中一行
-c 打印每一重复行出现次数。
-f n为数字,前n个域被忽略。

实战教学:

技术分享

注:编辑数字为了测试

技术分享

注意:uniq -c 命令打印每一次重复出现的行,并用sort进行排序

技术分享

注:uniq -u命令显示不重复的行

技术分享

注:uniq -d只显示重复的行

技术分享

注:uniq -c -d 组合使用,显示重复的次数

Sort排序命令详解:

-b:忽略每行前面开始出的空格字符;

-c:检查文件是否已经按照顺序排序;

-d:排序时,处理英文字母、数字及空格字符外,忽略其他的字符;

-f:排序时,将小写字母视为大写字母;

-i:排序时,除了040至176之间的ASCII字符外,忽略其他的字符;

-m:将几个排序号的文件进行合并; -M:将前面3个字母依照月份的缩写进行排序;

-n:依照数值的大小排序;

-o<输出文件>:将排序后的结果存入制定的文件;

-r:以相反的顺序来排序;

-t<分隔字符>:指定排序时所用的栏位分隔字符;

实战教学:

技术分享

注:实战源文件

技术分享

注:sort命令默认排序

技术分享

注:sort -r 以相反的顺序进行排序

技术分享

注:以上命令是将第三列的数组按照从小到大排列

技术分享

注:以上命令是将第三列的数组按照从大到小排列

for循环和while循环

#! /bin/bash

PREFIX=yangxu

I=0

while [ $I -le 20 ]

do

useradd ${PREFIX}$I

echo "123.com"|passwd --stdin ${PREFIX}$I

let I++

done

用for循环开发乘法口诀表:

#! /bin/bash

for a in `seq 1 9`

        do

                for b in `seq 1 9`

        do

                if [ $a  -ge $b ]

                        then

                                echo -ne " $a x $b = $(expr $a \* $b)"

 

fi

done

echo "       "

 

done

执行效果:

技术分享

循环打印出1-10

#! /bin/bash

for i in `seq 10`

do

echo $i

done

执行效果:

技术分享

双重for循环:

#! /bin/bash

for i in `echo www.`

do

        for b in `echo qq.com qq.cn 163.com 163.cn`

do

echo $i $b     

done

do

执行效果:

技术分享

用for循环来观察continue和break 和exit的区别

#! /bin/bash

 

for ((i=0 ; i<=6 ; i++))

do

        if [ $i -eq 3 ];then

continue

#break

                #exit

        fi

                echo $i

done

echo "ok"

continue

执行效果:

技术分享

注:continue就是当循环当这个i=3的时候就跳过这次循环,直接进行下一次循环

Break执行效果:

技术分享

注:break如果满足条件直接跳出此循环,输出循环外的参数

exit执行效果:

技术分享

注:exit如果满足条件输出,就会直接跳出脚本

用shell脚本开发一个配置临时ip的脚本:

#! /bin/bash

case $1 in

  up)

for ((i=0; i<=10; i++))

do

if [ $i -eq 5 ]

        then

                continue

        fi

ifconfig eth0:$i 192.168.0.$i netmask 255.255.255.0 $1

done

;;

  down)

for ((i=0; i<=10; i++))

do

if [ $i -eq 5 ]

        then

                continue

        fi

ifconfig eth0:$i 192.168.0.$i netmask 255.255.255.0 $1

done

;;

  *)

echo "Usage {up | down}"

esac

用shell脚本开发批量创建用户脚本,并用随机数为密码,将用户和密码打印到pw.txt文件中

#! /bin/bash

I=0

PREFIX=user-

while [ $I -le 20 ]

do

PW=`echo $RANDOM|md5sum|cut -c 5-12`

useradd ${PREFIX}$I

echo ${PREFIX}$I $PW >>pw.txt

echo "----------------">>pw.txt

echo $PW |passwd --stdin ${PREFIX}$I

let I++

done

执行结果:

技术分享

用shell脚本开发一个脚本执行菜单

#! /bin/bash

                      echo "脚本配置菜单"

echo "1.安装配置服务"

echo "2.创建删除用户"

echo "3.配置网络"

echo "请输入要执行的菜单命令(1/2/3):"

read com

case $com in

1)

echo "1.Nginx安装"

echo "2.Mysqld安装"

echo "3.PHP安装"

 

read a

        if [ $a -eq 1 ]

                then

                bash nginx.sh

        else

        if [ $a -eq 2 ]

                then

                bash mysql.sh

        else

        if [ $a -eq 3 ]

        then

        echo "您正在安装PHP服务,请稍后。。。"

        fi

               fi

               fi

;;

2)

echo "1.创建用户"

echo "2.删除用户"

read b

        if [ $b -eq 1 ]

                then

                bash useradd.sh

                else

        if [ $b -eq 2 ]

                then

                bash userdel.sh

        fi

        fi

;;

3)

echo "1.配置ip地址"

echo "2.重启网络服务"

read c

        if [ $c -eq 1 ]

        then

        bash ip.sh

  else

        if [ $c -eq 2 ]

        then

        bash fuwu.sh

        fi

        fi

;;

*)

echo "请输入要执行的菜单命令(1/2/3):"

;;

esac

执行效果:

技术分享

条件测试:

运算符:

整数比较运算符                                       描述

num1 –eq       num2                  如果num1等于 num2,测试结果为0

num1 –ge num2                   如果num1大于或等于 num2,测试结果为0

num1 –gt num2                    如果num1大于 num2,测试结果为0

num1 –le num2                  如果num1小于或等于 num2,测试结果为0

num1 –lt  num2                  如果num1小于 num2,测试结果为0

num1 –ne num2                   如果num1不等于 num2,测试结果为0

判断文件 -f

技术分享

判断普通文件–e

技术分享

判断目录–d

技术分享

判断文件是否有执行权-x

技术分享

判断是否为空–z

技术分享

判断是否不为空-n

技术分享

-r测试是否有读的权限

加减乘除运算:

利用shell脚本开发计算器,用read读入方式,并对变量个数进行判断

#! /bin/bash

read -t 5 -p "Pls input two number :" a b

expr $a + 0 &>/dev/null

expr $b + 0 &>/dev/null

        if [ $? -eq 0 ]

                then

 

                        echo "a-b=$((a-b))"

                        echo "a+b=$((a+b))"

                        echo "a*b=$((a*b))"

                        echo "a/b=$((a/b))"

 

                else

                        exit

        fi

利用shell脚本开发计算器,用传参方式,并对变量个数进行判断

#! /bin/bash

a=$1

b=$2

function YUN(){

         echo "a+b=$((a+b))"

         echo "a-b=$((a-b))"

         echo "a*b=$((a*b))"

         echo "a/b=$((a/b))"

}

        if [ $# -eq 2 ]

                then

                        YUN

                else

                        echo "Pls input two number"

                exit

        fi     

 

case $1 in

 *)

   exit

;;

esac

执行效果:

技术分享

Bc命令计算:

技术分享

Expr命令计算

技术分享

小括号算法:

技术分享

技术分享

定义函数以及调用函数

#! /bin/bash

#定义变量

function Number(){

seq -w 10

}

function Zimu(){

echo {a..z}

}

#调用变量

 Number

 Zimu

执行结果:

技术分享

调用系统变量/etc/init.d/functions

#! /bin/bash

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

action "nginx is running"  /bin/true

action "nginx is stoped"   /bin/false

执行结果:

技术分享

用shell脚本开发nginx服务启动脚本

#! /bin/bash

NGINX="/usr/local/nginx/sbin/nginx"

nginxSTOP="killall -s QUIT nginx"

. /etc/init.d/functions

nginxNumber=`netstat -anpt |grep nginx|wc -l`

 

case $1 in

  start)

        $NGINX

        [ $? -eq 0 ]&&action "nginx is running" /bin/true || action "nginx is running" /bin/false

;;

  stop)

        $nginxSTOP

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

;;

  restart)

        $0 stop

               Sleep 2

        $0 start

;;

  *)

echo " Usage {stop | start |restart }"

esac

执行效果:

技术分享

方法二:Nginx服务启动脚本

#! /bin/bash

# chkconfig:- 85 15

# description:hehe

PROG="/usr/local/nginx/sbin/nginx"

PID="/usr/local/nginx/logs/nginx.pid"

 

case "$1" in

 start)

$PROG

if [ $? -eq 0 ]

  then

        echo  "正在启动nginx服务" 

fi

;;

 stop)

killall -s QUIT nginx

if [ $? -eq 0 ]

 

then

        echo  "正在关闭nginx服务"

fi

;;

status)

DUAN=$(netstat -anpt |grep nginx |awk -F ‘ ‘ ‘{print $4}‘ |awk -F  ‘:‘ ‘{print $2}‘)

if [ -z $DUAN  ]

then

        echo "服务没有启动"

else

 

if [ $DUAN=80 ]

then

        echo "服务已经启动"

else

        echo "服务没有启动"

fi

fi

;;

 

restart)

$0 stop

$0 start

 

echo "正在重启nginx服务"

;;

 *)

echo "Usage: $0 (start|stop|restart )"

exit 1

esac

exit 0

执行结果:

技术分享

用shell脚本判断1.0网段有多少ip在线

#! /bin/bash

. /etc/init.d/functions

for i in `seq 1 254`

do

ping -c 3 -w 3 192.168.1.$i >>/dev/null &&action "host 192.168.1.$i" /bin/true ||action "host 192.168.1.$i" /bin/false

done

执行结果:

技术分享

此脚本可以改变系统字体颜色,脚本有点小瑕疵

#!/bin/bash

#把所以颜色定义变量

Black=`echo -e "\033[30m 黑色字 \033[0m"`

Red=`echo -e "\033[31m 红色字 \033[0m"`

Green=`echo -e "\033[32m 绿色字 \033[0m"`

Yellow=`echo -e "\033[33m 黄色字 \033[0m"`

Blue=`echo -e "\033[34m 蓝色字 \033[0m"`

Purple=`echo -e "\033[35m 紫色字 \033[0m"`

Blue_words=`echo -e "\033[36m 天蓝字 \033[0m"`

White=`echo -e "\033[37m 白色字 \033[0m"`

read -p " What color do you like? :" com

#用case语句匹配

case $com in

  red )

         $Red

;;

  black)

        $Black

;;

  green)

        $Green

;;

  blue)

        $Blue

;;

  yellow)

        $Yellow

;;

  white)

        $White

;;

  purple)

        $Purple

;;

  blue_words)

        $Blue_words

;;

  *)

     echo "Usage: Pls input {red | black | green | yellow | white | purple | blue_words | blue |} "

;;

Esac

执行效果:

技术分享

注:以上脚本调用变量的时候加echo就ok

用curl命令远程探测服务端口,如果服务宕机并重启

#! /bin/bash

. /etc/init.d/functions

Check_curl=`curl -I -s http://192.168.1.103/test.html|head -1|cut -d " " -f2`

Check_curl1=`curl -I -s http://192.168.1.103/test.html|head -1|cut -d " " -f3`

 

if [ "$Check_curl" == "200" ]

        then

                  action "nginx is running" /bin/true

        else

if [ "$Check_curl1" == "OK" ]

        then

                action "nginx is running" /bin/true

        else

                action "nginx is stoped" /bin/false

                service nginx start >>/dev/null

fi

fi

执行结果:

技术分享

用nmap远程探测工具,模拟用户探测服务是否宕机

#! /bin/bash

. /etc/init.d/functions

nmapPort=`nmap 192.168.1.103  -p 80|grep -w "open"|cut -d " " -f2`

nmapService=`nmap 192.168.1.103 -p 80|grep -w "open"|cut -d " " -f4`

if [ $nmapPort == "open" ]

        then

                action "httpd is running" /bin/true

        else

if [ $nmapService == "httpd" ]

        then

                action "httpd is running" /bin/true

        else

                  action "httpd is stoped" /bin/false

fi

fi

方法二,用脚本传参的方式实现上述功能:

#! /bin/bash

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

if [ $# -ne 2 ]

        then

echo "Usage:Pls input {IP and port}"

 

exit

fi

 

 

Nmap=`nmap $1 -p $2 |grep open|wc -l`

if [ "$Nmap" == 1 ]

        then

action "$1 $2 is running" /bin/true

        else

action "$1 $2 is closed" /bin/false

 

fi

数组:

技术分享

注:以上是定义数组和查看数组的长度和数组的内容

删除数组:

技术分享

将数组中的4改为10

技术分享

用for打印数组中的数到10就退出:

#!/bin/bash

array=( 1 2 3 10 11)

for i in `echo ${array[*]}`

do

if [ $i -eq 10 ]

        then

                break

fi

echo $i

done

技术分享

打印出数组内容和数组长度:

#! /bin/bash

array=(1 2 3)

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

do

echo "This is number $i,then content is ${array[$i]}"

done

echo "----------------------"

echo "this is length is  ${#array[*]}"

echo "数组内容为 ${array[*]}"

执行效果:

技术分享

用for循环批量该文件名:

#! /bin/bash

for filename in `ls *.jpg`

do

mv $filename `echo $filename|cut -d "." -f1`.gif

done

方法二:

#! /bin/bash

for i in `ls *.txt`

do

mv $i `echo $i |cut -d "." -f1`.doc

done

1.查看系统信号,并对信号进行处理

技术分享

技术分享

注:常用信号处理,需记忆

技术分享

做完信号处理,我们再运行守护进程,验证效果:

技术分享

现在就可以看到在一个守护进程中,无法用ctrl+c来停止

Shell跳板机:

#! /bin/bash

function trapper(){

trap "" `seq 1 64`

}

while :

do

trapper 

        clear

        cat <<menu

        1)web 1

        2)web 2

        3)exit

menu

read -p "Pls select :" num

case "$num" in

1)

echo 1

ssh 192.168.1.1

;;

2)

echo 2

ssh 192.168.1.2

;;

3|*)

exit

esac

done

 

[ $UID -ne 0 ]&& . /scripts/service/tiaoban.sh---------在/etc/profile.d/创建文件,写入---[ $UID -ne 0 ]&& . /scripts/service/tiaoban.sh

Linux Shell编程讲解