首页 > 代码库 > 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编程讲解