文章出處

                 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


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()