linux測試腳本
讀寫失敗時dd的返回值分別是多少一直查不到,而如果這個沒法弄明白的話,校驗的對錯就沒什麼意義了(根本不知道是dd出的錯還是md5sum出的錯),算了,你將就一下吧,查到後改一下就好了。
#!
/bin/bash
infile="$1"
cycle=0
=0
err=0
if
[
"$#"
-ne
1
]
||
[
!
-f
"$1"
]
then
echo
"用法:test
<infile>"
exit
1;
fi
echo
-e
"<>警告<>:本測試程序對磁碟有較大損害,請您謹慎運行。"
echo
-e
"
按Crtl+C鍵終止測試"
echo
-e
"開始測試?(y/n)y:c"
while
read
-r
answer
</dev/tty
do
if
[
"$answer"
==
'n'
]
||
[
"$answer"
==
'N'
]
then
echo
"結果:$cycle
輪共
$
次復制,讀/寫錯誤
$err
次"
rm
-f
${infile}_*
exit
0
fi
let
cycle++
echo
"=========================
第
$cycle
輪
==========================="
rm
-f
"$infile"_*
sync
let
++
#方便起見,選第一分區爆之
while
[
"$(df
-k|sed
-n
'3q;2s/
*/
/g;2p'|cut
-d
'
'
-f
4)"
-gt
1
]
do
echo
"===========
副本
$
==========="
outfile="${infile}_${}"
dd
if="$infile"
of="$outfile"
#關於dd命令如果遭遇讀失敗或寫失敗的返回碼無據可查,但肯定不是0,
另一種實現方法是用md5sum
--status檢驗,但這種方法看起來多此一舉反而導致讀寫比變>為3:1
if
[
"$?"
-ne
0
]
then
let
err++
fi
let
++
echo
&&
sync
trap
"echo
'結果:'
$cycle
'輪共'
$
'次復制,讀/寫錯誤'
$err
'次'
&&
rm
-f
${infile}_*
&&
exit;"
1
2
3
15
done
echo
-e
"磁碟已滿,刪除測試文件後繼續?(y/n)y:c"
done
B. 以下linux測試帶寬腳本內容是保存在linux系統裡面那個文件
首先確認這個腳本是通過什麼用戶執行的,假設是root
進入root賬號
crontab -l 列出所有root用戶的cron job,然後你就可以知道哪個文件是這個腳本的位置了
C. Linux expect
expect:expect是Unix系統中用來進行自動化控制和測試的腳本工具,常用於實現互動式任務的自動化。使用命令」dnf install expect -y」進行安裝。腳本文件聲明為」#!/usr/bin/expect」。
expect常用命令如下:
1.spawn+交互命令(如spawn ssh [email protected]):」spawn」是expect的初始命令,用於啟動一個新的交互進程,之後所有的操作都會在這個進程中進行。
2.set:定義變數/為變數賦值。使用語法:set 變數名 值。
3.puts:將變數值/字元串定向到本地標准輸出文件(即定位到屏幕)。使用語法:puts 「字元串/$變數名」
4.send_user:作用和使用方法類似於」puts」,區別在於」puts」會在輸出內容的結尾自動追加一個換行符,而」send_user」不會。
5.send:向交互進程發送信息/命令(字元串和一些特殊符號,\r—回車,\n—換行,\t—製表符)。使用語法:send 「信息/命令[\r]」。
6.[lindex $argv 數字]:表示外部傳遞參數的值,數字是n,就表示第n-1個參數。註:$argc表示外部傳遞參數的個數,也是一個值。
7.expect+字元串+{ 命令 }:將字元串與交換進程接收到的信息進行匹配。如果匹配成功(字元串是交換進程接收到的信息的一部分),執行包含在」{}」中的命令;如果匹配失敗,不執行包含在」{}」中的命令。該命令有三種使用方法:
第一種:單分支模式
①expect 字元串 { 命令 }
解釋:如果字元串與交換進程接收到的信息匹配成功,執行包含在」{}」中的命令,並結束該expect命令;如果字元串與交換進程接收到的信息匹配失敗,timeout秒後結束該expect命令。(註:腳本執行到expect命令時,計時器就開始計時,並會在計時器超時前不斷對交換進程接收到的信息進行掃描,嘗試字元串與信息的匹配。)
②expect {
字元串{ 命令 }
timeout { 命令 }
}
解釋:如果字元串與交換進程接收到的信息匹配成功,執行包含在」{}」中的命令,並結束該expect命令;如果字元串與交換進程接收到的信息匹配失敗,timeout秒後執行包含在」{}」中的命令,之後結束該expect命令。(註:腳本執行到expect命令時,計時器就開始計時,並會在計時器超時前不斷對交換進程接收到的信息進行掃描,嘗試字元串與信息的匹配。)
第二種:多分支模式
①expect {
字元串1 { 命令 }
字元串2 { 命令 }
}
解釋:如果字元串1與交換進程接收到的信息匹配成功,執行執行包含在」{}」中的命令,並結束該expect命令;如果字元串1與交換進程接收到的信息匹配失敗、字元串2與交換進程接收到的信息匹配成功,執行包含在」{}」中的命令,並結束該expect命令;如果字元串1、字元串2皆與交換進程接收到的信息匹配失敗,timeout秒後結束該expect命令。(註:腳本執行到expect命令時,計時器就開始計時,並會在計時器超時前不斷對交換進程接收到的信息進行掃描,嘗試字元串與信息的匹配。)
②expect {
字元串1 { 命令 }
字元串2 { 命令 }
timeout { 命令 }
}
解釋:如果字元串1與交換進程接收到的信息匹配成功,執行執行包含在」{}」中的命令,並結束該expect命令;如果字元串1與交換進程接收到的信息匹配失敗、字元串2與交換進程接收到的信息匹配成功,執行執行包含在」{}」中的命令,並結束該expect命令;如果字元串1、字元串2皆與交換進程接收到的信息匹配失敗,timeout秒後執行包含在」{}」中的命令,之後結束該expect命令。(註:腳本執行到expect命令時,計時器就開始計時,並會在計時器超時前不斷對交換進程接收到的信息進行掃描,嘗試字元串與信息的匹配。)
第三種:循環多分支模式(註:exp_continue命令只能出現在expect命令的匹配語句中,執行到exp_continue命令時,腳本會跳出當前expect命令,並重新執行該expect命令,直到expect命令通過不包含exp_continue命令的匹配語句結束、或expect命令匹配超時結束。)
①expect {
字元串1 { 命令; exp_continue }
字元串2 { 命令 }
}
解釋:如果字元串1與交換進程接收到的信息匹配成功,執行執行包含在」{}」中的命令,並重新執行該expect命令;如果字元串1與交換進程接收到的信息匹配成功,執行執行包含在」{}」中的命令,並重新執行該expect命令...;如果字元串1與交換進程接收到的信息匹配失敗、字元串2與交換進程接收到的信息匹配成功,執行包含在」{}」中的命令,並結束該expect命令;如果字元串1、字元串2皆與交換進程接收到的信息匹配失敗,timeout秒後結束該expect命令。(註:腳本執行到expect命令時,計時器就開始計時,並會在計時器超時前不斷對交換進程接收到的信息進行掃描,嘗試字元串與信息的匹配。)
②expect {
字元串1 { 命令; exp_continue }
字元串2 { 命令 }
timeout { 命令 }
}
解釋:如果字元串1與交換進程接收到的信息匹配成功,執行執行包含在」{}」中的命令,並重新執行該expect命令;如果字元串1與交換進程接收到的信息匹配成功,執行執行包含在」{}」中的命令,並重新執行該expect命令...;如果字元串1與交換進程接收到的信息匹配失敗、字元串2與交換進程接收到的信息匹配成功,執行包含在」{}」中的命令,並結束該expect命令;如果字元串1、字元串2皆與交換進程接收到的信息匹配失敗,timeout秒後執行包含在」{}」中的命令,之後結束該expect命令。(註:腳本執行到expect命令時,計時器就開始計時,並會在計時器超時前不斷對交換進程接收到的信息進行掃描,嘗試字元串與信息的匹配。)
8.timeout:timeout是expect中的一個關鍵字變數,用於控制expect命令的超時時間。需要注意的是,這個超時時間針對於整個expect命令,而不是針對於expect命令中的某條匹配語句。也就是說,只有expect命令中所有匹配語句都匹配失敗後,才會開始計算超時時間。timeout變數值預設為10(秒),我們可以通過」set timeout=值」的方式為其重新賦值,作用范圍:本次賦值到下一次賦值間的所有expect命令。註:如果需要為timeout變數重新賦值,應在expect命令之外進行。
9.expect eof:該命令的作用是結束spawn交互進程,將命令行切回至運行腳本的主機(即從遠端伺服器登出)。
10.interact:預設情況下,expect腳本執行完畢後會自動從遠端伺服器登出(即便沒有顯式地執行」expect eof」命令)。使用interact命令後,expect腳本執行完畢會繼續保持當前狀態,並將控制權移交給用戶。
11.exit:結束該腳本。
expect中的if語句:
if { 條件表達式 } {
命令
}
if { 條件表達式 } {
命令
} else {
命令
}
expect中的while語句:
while { 條件表達式 } {
命令
}
expect中的for語句:
for { set i 1 } { $i <=10 } { incr i } {
命令
}
incr變數名 步長 ——變數自增
incr 變數名 -步長 ——變數自減
數學運算需使用let、expr等工具
D. 使用Linux腳本用wegt命令測試鏈接是否有效
linux測試網路是否連通ping、telnet命令 閱讀數 930 ...wgetip:port連接存在的埠連接不存在的埠二
E. linux中一鍵測試腳本bench.sh怎麼停止
"首先腳本需要有執行許可權:chmod u x file.sh;執行腳本有三種方法:1. ./file.sh:特點:開啟bash子進程來執行,也就是開啟額外的進程來進行,不影響原進程的變數
F. Linux中測試腳本寫好運行後提示語法錯誤咋回事
#!/bin/bash
read-p"pleaseenteryourscore(0-100)":a
if[$a-ge86]&&[$a-le100];then
echo"$aisgreat"
elif[$a-ge60]&&[$a-le85];then
echo"$aispass"
else
echo"$aisfail"
fi
G. 如何測試linux crontab的腳本是否有執行
腳本寫日誌
查看crontab的系統日誌
H. 如何編寫linux下執行測試軟體命令按時間間隔的腳本
編寫腳本fio.sh,內容:
#/bin/sh
fio -filename=/dev/sdl -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=8k -size=200G -numjobs=30 -runtime=60 -group_reporting -name=mytest
sleep 60
fio -filename=/dev/sdb -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=32k -size=200G -numjobs=30 -runtime=60 -group_reporting -name=mytest
sleep 60
fio -filename=/dev/sdb -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=32k -size=200G -numjobs=1 -runtime=60 -group_reporting -name=mytest
sleep 60
fio -filename=/dev/sdb -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=32k -size=200G -numjobs=1 -runtime=60 -group_reporting -name=mytest
執行腳本:
bash ./fio.sh >
fio.log 2>&1
I. Linux Shell 腳本編程最佳實踐
IT路邊社
前言
與其它的編碼規范一樣,這里所討論的不僅僅是編碼格式美不美觀的問題, 同時也討論一些約定及編碼標准。這份文檔主要側重於我們所普遍遵循的規則,對於那些不是明確強制要求的,我們盡量避免提供意見。
編碼規范對於程序員而言尤為重要,有以下幾個原因:
本文檔中的准則致力於最大限度達到以下原則:
盡管本文檔涵蓋了許多基礎知識,但應注意的是,沒有編碼規范可以為我們回答所有問題,開發人員始終需要再編寫完代碼後,對上述原則做出正確的判斷。
注 :未明確指明的則默認為必須(Mandatory)
主要參考如下文檔:
僅建議Shell用作相對簡單的實用工具或者包裝腳本。因此單個shell腳本內容不宜太過復雜。
在選擇何時使用shell腳本時時應遵循以下原則:
可執行文件不建議有擴展名,庫文件必須使用 .sh 作為擴展名,且應是不可執行的。
執行一個程序時,無需知道其編寫語言,且shell腳本並不要求具有擴展名,所以更傾向可執行文件沒有擴展名。
而庫文件知道其編寫語言十分重要,使用 .sh 作為特定語言後綴的擴展名,可以和其他語言編寫的庫文件加以區分。
文件名要求全部小寫, 可以包含下劃線 _ 或連字元 - , 建議可執行文件使用連字元,庫文件使用下劃線。
正例:
反例:
源文件編碼格式為UTF-8。避免不同操作系統對文件換行處理的方式不同,一律使用 LF 。
每行最多不超過120個字元。每行代碼最大長度限制的根本原因是過長的行會導致閱讀障礙,使得縮進失效。
除了以下兩種情況例外:
如出現長度必須超過120個字元的字元串,應盡量使用here document或者嵌入的換行符等合適的方法使其變短。
示例:
除了在行結束使用換行符,空格是源文件中唯一允許出現的空白字元。
對從來沒有用到的或者被注釋的方法、變數等要堅決從代碼中清理出去,避免過多垃圾造成干擾。
Bash 是唯一被允許使用的可執行腳本shell。
可執行文件必須以 #!/bin/bash 開始。請使用 set 來設置shell的選項,使得用 bash echo "Process $: Done making $$$."
# 示例7:命令參數及路徑不需要引號 grep -li Hugo /dev/ "$1"
# 示例8:常規變數用雙引號,ccs可能為空的特殊情況可不用引號 git send-email --to "${reviewers}" ${ccs:+"--cc" "${ccs}"}
# 示例9:正則用單引號,$1可能為空的特殊情況可不用引號 grep -cP '([Ss]pecial||?characters*) ${1:+"$1"}
# 示例10:位置參數傳遞推薦帶引號的"$@",所有參數作為單字元串傳遞用帶引號的"$*" # content of t.sh func_t { echo num: $# echo args: 1:$1 2:$2 3:$3 }
func_t "$@" func_t "$*" # 當執行 ./t.sh a b c 時輸出如下: num: 3 args: 1:a 2:b 3:c num: 1 args: 1:a b c 2: 3:
使用 $(command) 而不是反引號。
因反引號如果要嵌套則要求用反斜杠轉義內部的反引號。而 $(command) 形式的嵌套無需轉義,且可讀性更高。
正例:
反例:
條件測試
使用 [[ ... ]] ,而不是 [ , test , 和 /usr/bin/[ 。
因為在 [[ 和 ]] 之間不會出現路徑擴展或單詞切分,所以使用 [[ ... ]] 能夠減少犯錯。且 [[ ... ]] 支持正則表達式匹配,而 [ ... ] 不支持。參考以下示例:
盡可能使用變數引用,而非字元串過濾。
Bash可以很好的處理空字元串測試,請使用空/非空字元串測試方法,而不是過濾字元,讓代碼具有更高的可讀性。正例:
反例:
正例:
反例:
正例:
反例:
文件名擴展
當進行文件名的通配符擴展時,請指定明確的路徑。
當目錄中有特殊文件名如以 - 開頭的文件時,使用帶路徑的擴展通配符 ./* 比不帶路徑的 * 要安全很多。
應該避免使用eval。
Eval在用於分配變數時會修改輸入內容,但設置變數的同時並不能檢查這些變數是什麼。反例:
請使用進程替換或者for循環,而不是通過管道連接while循環。
這是因為在管道之後的while循環中,命令是在一個子shell中運行的,因此對變數的修改是不能傳遞給父shell的。
這種管道連接while循環中的隱式子shell使得bug定位非常困難。反例:
如果你確定輸入中不包含空格或者其他特殊符號(通常不是來自用戶輸入),則可以用for循環代替。例如:
使用進程替換可實現重定向輸出,但是請將命令放入顯式子 shell,而非 while 循環創建的隱式子 shell。例如:
總是檢查返回值,且提供有用的返回值。
對於非管道命令,使用 $? 或直接通過 if 語句來檢查以保持其簡潔。
例如:
當內建命令可以完成相同的任務時,在shell內建命令和調用外部命令之間,應盡量選擇內建命令。
因內建命令相比外部命令而言會產生更少的依賴,且多數情況調用內建命令比調用外部命令可以獲得更好的性能(通常外部命令會產生額外的進程開銷)。
正例:
反例:
載入外部庫文件不建議用使用.,建議使用source,已提升可閱讀性。正例:
反例:
除非必要情況,盡量使用單個命令及其參數組合來完成一項任務,而非多個命令加上管道的不必要組合。常見的不建議的用法例如:cat和grep連用過濾字元串; cat和wc連用統計行數; grep和wc連用統計行數等。
正例:
除特殊情況外,幾乎所有函數都不應該使用exit直接退出腳本,而應該使用return進行返回,以便後續邏輯中可以對錯誤進行處理。正例:
反例:
推薦以下工具幫助我們進行代碼的規范:
原文鏈接:http://itxx00.github.io/blog/2020/01/03/shell-standards/
獲取更多的面試題、腳本等運維資料點擊: 運維知識社區 獲取
腳本之---簡訊轟炸機
腳本之---QQ微信轟炸機
ansible---一鍵搭建redis5.0.5集群
elk7.9真集群docker部署文檔
全球最全loki部署及配置文檔
最強安全加固腳本2.0
一鍵設置iptbales腳本
