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
文章列表