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 "[email protected];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

时间: 2024-08-02 23:01:56

Linux Shell编程讲解的相关文章

京峰Linux Shell编程从入门到精通

课程介绍:Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口.它接收用户输入的命令并把它送入内核去执行. -------------------课程目录------------------- <Shell编程从入门到精通> ├1.linux下shell编程基础入门_(new).mp4├2.Shell编程之变量及LAMP导航菜单编写_(new).mp4├3.Shell编程之IF条件语句各种案例演练_(new).mp4├4.使用if条件语句编写MySQL备份脚本_(new).mp4

Linux Shell编程之二选择结构

Shell编程学习之二 一.bash的条件测试 测试方法或者说测试书写: test EXPR [ EXPR ] [[ EXPR ]] 例如:测试变量 User_Name 的之是否为root test $User_Name="root" [ $User_Name == "root" ] [[ $User_Name == "root" ] 根据比较时操作数的类型,测试类型分为: 测试类型 运算符 运算符所代表的意义 示例 整形测试 -gt -lt -

Linux Shell 编程实战技巧

目前,越来越多的企业应用会部署在 Linux 系统上的,而 Linux Shell 脚本可以极大地帮助我们完成这些应用的运维任务.这使得 Linux Shell 开发技能成为开发人员的一项重要的.有竞争力的技能.本文就笔者的实际开发经验,以 Korn Shell 为例分享了脚本开发中的常见问题及相关技巧. 避免定时任务脚本的常见问题 很多脚本在实际使用的时候往往是以定时任务的方式运行,而非手工运行.但是实现同样功能的脚本在这两种运行方式下可能遇到的问题不尽相同. 以定时任务方式运行的脚本往往会遇

Linux Shell编程之五字符串的处理

shell编程之字符串处理 在 shell 中,由于是一种弱类型的语言,在没有事先申明变量类型的情况下,所有的变量都是字符串.所以对字符串的处理就显得相当重要了. 下面介绍常见的对字符串处理的操作. 一.字符串切片 ${string_var:offest:length},类似于数组元素的提取. # 这里的string_var是一个变量,offest 是字符串的开始偏移量,length是切去字符串的长度 var=dhcpd:x:177:177:DHCP server:/:/sbin/nologin

关于linux shell编程,alias rm=&#39;cp [email&#160;protected] ~/backup; rm [email&#160;protected]&#39;

书上的这个例子需要在ubuntu的低版本的系统才支持,现在基本上都不支持了,想实现也很简单自己写一个脚本先备份再删除. alias也只是做了一次替换alias rm='cp [email protected] ~/backup; rm [email protected]' rm text.txt被转换成了cp  [email protected] ~/backup; rm [email protected] text.txt即cp  ~/backup; rm  text.txt可以看到text.

linux shell编程

1.什么是shell 2. 还是hello world程序 3. shell中的变量 3.1 系统变量 3.2 用户定义变量 3.2.1 用户定义变量规则 3.2.3 shell如何使用变量 3.2.3 全局变量 vs 局部变量 4. shell编程中的控制结构 4.1 条件判定 4.1.1 简单条件判定 4.1.2 组合判定 4.2  if - else 4.3 for 4.4 while 4.5 case 5. shell中的函数 5.1 函数声明和定义 5.2 函数调用 6. shell脚

Linux Shell编程入门

从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操作.在Linux GUI日益完善的今天,在系统管理等领域,Shell编程仍然起着不可忽视的作用.深入地了解和熟练地掌握Shell编程,是每一个Linux用户的必修 功课之一. Linux的Shell种类众多,常见的有:Bourne Shell(/usr/bin/sh或/bin/sh).Bourne

“Linux Shell编程”视频学习笔记

一.Linux Shell基础编程 视频1 1.1.查看你系统shell信息 $ cat /etc/shell 命令可以获取Linux系统里面有多少种shell程序 $ echo $SHELL 命令可以查看当前你所使用的shell是哪一个 1.2.查看文件信息,ls $ ls -l 查看文件信息:文件类型.文件权限.文件硬链接数.文件所属用户.文件所属组.文件大小.文件最近修改时间.文件名 1.3.改变文件权限,chmod 只有root用户或者文件的所有者能改变文件的权限 例子:$ chmod

Linux Shell编程基础

在学习Linux BASH Shell编程的过程中,发现由于不经常用,所以很多东西很容易忘记,所以写篇文章来记录一下 ls   显示当前路径下的文件,常用的有 -l 显示长格式  -a 显示所有包括隐藏  -R 显示文件夹内的内容  -c 按照最后一次修改时间排序  -t 按照修改时间排序输出 echo 显示  -n 不换行 touch  创建一个文件,或者修改文件的访问时间和修改时间 touch -a file 只更改访问时间 -m之更改修改实际那 -t指定特定时间 cp  复制文件 -a 保