當前位置:首頁 » 網頁前端 » 面試shell腳本編寫
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

面試shell腳本編寫

發布時間: 2023-03-19 10:27:21

㈠ 軟體測試應聘時,問你會shell編程嗎怎麼回答

沒問題,shell編程告州很簡單,隨便在網上找本介紹,就能直接開始寫了,不會寫的網上都能找襪沒蔽到,我當時就是什麼都不察孫會,一上午就從無到有,完成了一個shell編程

㈡ 寫一個shell腳本——統一執行oracle的ddl文件

sqlplususername/password@orcl<<EOF
@test.sql
exit
EOF

自動執行一般都是這種空謹團方法斗橘晌殲

㈢ 面試軟體測試工程師,被問到 shell腳本,應該怎麼回答

其實shell並沒有想像中那麼高大上的,無非就是n個linux命令寫在一個文件里,這個文件就是shell腳本,然後 「sh 文件名」,執行這個shell文件,就是在執行裡面的腳本,一條一條的執行。我一般用到shell的時候都是部署環境和監控日誌,其他地方用到的少,大部分也是直接在伺服器上敲命令

㈣ 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腳本

㈤ Linux系統工程師面試題附答案

一、簡答題

1.如何將本地80埠的請求轉發到8080埠,當前主機IP為192.168.16.1,其中本地網卡eth0:

答:# iptables -t nat -A PREROUTING -d 192.168.16.1 -p tcp --dport 80 -j DNAT --to 192.168.16.1:8080

或 者:# iptables -t nat -A PREROUTING -i eth0 -d 192.168.16.1 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080

2.什麼是NAT,常見分為那幾種,DNAT與SNAT有什麼不同,應用事例有那些?

SNAT,DNAT,MASQUERADE都是NAT。

MASQUERADE是SNAT的一個特例。

SNAT是指在數據包從網卡發送出去的時候,把數據包中的源地址部分替換為指定的IP,這樣,接收方就認為數據包的來源是被替換的那個IP的主機。

MASQUERADE是用發送數據的網卡上的IP來替換源IP,因此,對於那些IP不固定的場合,比如撥號網路或者通過dhcp分配IP的情況下,就得用MASQUERADE。

DNAT,就是指數據包從網卡發送出去的時候,修改數據包中的目的IP,表現為如果你想訪問A,可是因為網關做了DNAT,把所有訪問A的數據包的目的IP全部修改為B,那麼,你實際上訪問的是B

因為,路由是按照目的地址來選擇的,因此,DNAT是在PREROUTING鏈上來進行的,而SNAT是在數據包發送出去的時候才進行,因此是在POSTROUTING鏈上進行的。

3.包過濾防火牆與代理應用防火牆有什麼區別,能列舉幾種相應的產品嗎?

4.iptables是否支持time時間控制用戶行為,如有請寫出具體操作步驟。

5.說出你知道的幾種linux/unix發行版本。

Redhat、CentOS、Fedora、SuSE、Slackware、Gentoo、Debian、Ubuntu、FreeBSD、Solaris、SCO、AIX、HP…

6.列出linux常見打包工具並寫相應解壓縮參數(至少三種)

7.計劃每星期天早8點伺服器定時重啟,如何實現?

8.列出作為完整郵件系統的軟體,至少二類。

9,當用戶在瀏覽器當中輸入一個網站,說說計算機對dns解釋經過那些流程?註:本機跟本地dns還沒有緩存

答:

a.用戶輸入網址到瀏覽器;

b.瀏覽器發出DNS請求信息;

c.計算機首先查詢本機HOST文件,看是否存在,存在直接返回結果,不存在,繼續下一步;

d.計算機按照本地DNS的順序,向合法dns伺服器查詢IP結果;

e.合法dns返回dns結果給本地dns,本地dns並緩存本結果,直到TTL過期,才再次查詢此結果;

嫌遲f.返回IP結果給瀏覽器;

g.瀏覽器根據IP信息,獲取頁面;

10,我們都知道,dns既採用了tcp協議,又採用了udp協議,什麼時候採用tcp協議?什麼時候採用udp協議?為什麼要這么設計?

答:這個題需要理解的東西比較的多,分一下芹肢李幾個方面

a,從數據包大小上分:UDP的最大包長度是65507個位元組,響應dns查詢的時候數據包長度超過512個位元組,而返回的只要前512個位元組,這時名字 解釋器通常使用TCP從發原來的請求。

b,從協議本身來分:大部分的情況下使用UDP協議飢野,大家都知道UDP協議是一種不可靠的協議,dns不像其它的使用UDP的Internet應用 (如:TFTP,BOOTP和SNMP等),大部分集中在區域網,dns查詢和響應需要經過廣域網,分組丟失和往返時間的不確定性在廣域網比區域網上更 大,這就要求dns客戶端需要好的重傳和超時演算法,這時候使用TCP。

11,一個EXT3的文件分區,當使用touch test.file命令創建一個新文件時報錯,報錯的信息是提示磁碟已滿,但是採用df -h命令查看磁碟大小時,只使用了,60%的磁碟空間,為什麼會出現這個情況,說說你的理由。

答:兩種情況,一種是磁碟配額問題,另外一種就是EXT3文件系統的設計不適合很多小文件跟大文件的一種文件格式,出現很多小文件時,容易導致inode 耗盡了。

12,我們都知道FTP協議有兩種工作模式,說說它們的大概的一個工作流程?

FTP兩種工作模式:主動模式(Active FTP)和被動模式(Passive FTP)

在主動模式下,FTP客戶端隨機開啟一個大於1024的埠N向伺服器的21號埠發起連接,然後開放N+1號埠進行監聽,並向伺服器發出PORT N+1命令。

伺服器接收到命令後,會用其本地的FTP數據埠(通常是20)來連接客戶端指定的埠N+1,進行數據傳輸。

在被動模式下,FTP客戶端隨機開啟一個大於1024的埠N向伺服器的21號埠發起連接,同時會開啟N+1號埠。然後向伺服器發送PASV命令,通 知伺服器自己處於被動模式。伺服器收到命令後,會開放一個大於1024的埠P進行監聽,然後用PORT P命令通知客戶端,自己的數據埠是P。客戶端收到命令後,會通過N+1號埠連接伺服器的埠P,然後在兩個埠之間進行數據傳輸。

總的來說,主動模式的FTP是指伺服器主動連接客戶端的數據埠,被動模式的.FTP是指伺服器被動地等待客戶端連接自己的數據埠。

被動模式的FTP通常用在處於防火牆之後的FTP客戶訪問外界FTp伺服器的情況,因為在這種情況下,防火牆通常配置為不允許外界訪問防火牆之後主機,而只允許由防火牆之後的主機發起的連接請求通過。

因此,在這種情況下不能使用主動模式的FTP傳輸,而被動模式的FTP可以良好的工作。

13.編寫個shell腳本將當前目錄下大於10K的文件轉移到/tmp目錄下

Q:主要是考察awk 這些的用法

#/bin/sh

#Programm :

# Using for move currently directory to /tmp

for FileName in `ls -l |awk ‘$5>10240 {print $9}’`

do

mv $FileName /tmp

done

ls -la /tmp

echo “Done! ”

14.apache有幾種工作模式,分別介紹下其特點,並說明什麼情況下採用不同的工作模式?

apache主要有兩種工作模式:prefork(apache的默認安裝模式)和worker(可以在編譯的時候加參數–with-mpm- worker選擇工作模式)

㈥ 運維必須掌握的Linux面試題

1、解釋下什麼是GPL,GNU,自由軟體?
GPL:(通用公共許可證):一種授權,任何人有權取得、修改、重新發布自由軟體的權力。
GNU:(革舉塌奴計劃):目標是創建一套完全自由、開放的的操作系統。
自由軟體:是一種可以不受限制地自由使用、復制、研究、修改和分發的軟體。主要許可證有GPL和BSD許可證兩種。
2、linux系統里,buffer和cache如何區分?

buffer和cache都是內存中的一塊區域,
當CPU需要寫數據到磁碟時,由於磁碟速度比較慢,所以CPU先把數據存進buffer,
然後CPU去執行其他任務,buffer中的數據會定期寫入磁碟;

當CPU需要從磁碟讀入數據時,由於磁碟速度比較慢,
可以把即將用到的數據提前存入碧答喚cache,CPU直接從Cache中拿數據要快的多。
3、描述Linux運行級別0-6的各自含義

0:關機模式
1:單用戶模式<==破解root密碼
2:無網路支持的多用戶模式
3:有網路支持的多用戶模式(文本模式,工作中最常用的模式)
4:保留悔凱,未使用
5:有網路支持的X-windows支持多用戶模式(桌面)
6: 重新引導系統,即重啟
4、描述Linux系統從開機到登陸界面的啟動過程

⑴開機BIOS自檢,載入硬碟
⑵讀取MBR,MBR引導。
⑶grub引導菜單(Boot Loader)。
⑷載入內核kernel。
⑸啟動init進程,依據inittab文件設定運行級別
⑹init進程,執行rc.sysinit文件。
⑺啟動內核模塊,執行不同級別的腳本程序。
⑻執行/etc/rc.d/rc.local
⑼啟動mingetty,進入系統登陸界面。
5、描述Linux下軟鏈接和硬鏈接的區別

在Linux系統中,鏈接分為兩種,一種是硬鏈接(Hard link),另一種稱為符號鏈接或軟鏈接(Symbolic Link)。
①默認不帶參數的情況下,ln創建的是硬鏈接,帶-s參數的ln命令創建的是軟鏈接。
②硬鏈接文件與源文件的inode節點號相同,而軟鏈接文件的inode節點號,與源文件不同,
③ln命令不能對目錄創建硬鏈接,但可以創建軟鏈接。對目錄的軟鏈接會經常使用到。
④刪除軟鏈接文件,對源文件和硬鏈接文件無任何影響。
⑤刪除文件的硬鏈接文件,對源文件及軟鏈接文件無任何影響。
⑥刪除鏈接文件的源文件,對硬鏈接文件無影響,會導致其軟鏈接失效(紅底白字閃爍狀)。
⑦同時刪除源文件及其硬鏈接文件,整個文件才會被真正的刪除。
⑧很多硬體設備的快照功能,使用的就是類似硬鏈接的原理。
⑨軟鏈接可以跨文件系統,硬鏈接不可以跨文件系統。
6、shell腳本中「$?」標記的用途是什麼?

在寫一個shell腳本時,如果你想要檢查前一命令是否執行成功,在if條件中使用「 ?
0

如果結束狀態是0,說明前一個命令執行成功。
root@localhost:~# ls /usr/bin/share
ls: cannot access /usr/bin/share: No such file or directory

root@localhost:~# echo $?
2
如果結束狀態不是0,說明命令執行失敗。
7、如何讓history命令顯示具體時間?

$ HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S"

$ export HISTTIMEFORMAT

重新開機後會還原,可以寫/etc/profile
8、用shell統計ip訪問情況,要求分析nginx訪問日誌,找出訪問頁面數量在前10位的IP數。以下是nginx的訪問日誌節選
202.101.129.218- - [26/Mar/2006:23:59:55 +0800] "GET /online/stat_inst.php?pid=d065HTTP/1.1" 302 20-"-" "-" "Mozilla/4.0(compatible; MSIE 6.0; Windows NT 5.1)"

1}' access.log |sort|uniq -c |head -n 10

31 202.101.129.218
21 123.93.29.11
11 13.92.19.31
9、將本地的80埠的請求轉發到8080埠,本機地址10.0.0.254,寫出命令
$ iptables -t nat -A PREROUTING -d 10.0.0.254 -p tcp --dprot 80 -j DNAT --to-destination 10.0.0.254:8080
10、Load過高的可能性有哪些?
排查思路:

其他經驗:
cpu load的飆升,一方面可能和full gc的次數增大有關,一方面可能和死循環有關
11、描述/etc/fstab 文件中每個欄位的含義?
(1)第一列:將被載入的文件系統名;
(2)第二列:該文件系統的安裝點;
(3)第三列:文件系統的類型;
(4)第四列:設置參數;
(5)第五列:供備份程序確定上次備份距現在的天數;
(6)第六列:在系統引導時檢測文件系統的順序。
12、 如何在打包時排除指定目錄?
$ tar --exclude=/home/dmtsai --exclude= .tar -zcvf myfile.tar.gz /home/ /etc

mysql> update user set password=password(�') where user='root'

㈦ 面試套路——如何應對Linux問題

面試中Linux問題是基礎知識部分中必然會問到的一塊,對於不常使用或沒有接觸過Linux的同學,如何巧妙應對呢?以下是我的經驗。

面試官 :Linux了解嗎?

我:還可以。

面試官:查看******的指令是什麼?

我:不清楚橡指冊。。。

面試官:查看******的指令呢?

我:不記得了。。。

(GG)

後來又一次跟學長吃飯,學長表示其逗擾實對於面試官Linux是加分項,會最好,不會也沒什麼。重要的是展示你了解多少,讓面試官覺得你有一定程度的了解的,而不是一定要把面試官問的問題答上來(想要做到這一點要花的功夫可不小)。所以在之後梁宏的面試中,我改變了戰術。

面試官:Linux了解嗎?

我:Linux我只有一些使用經驗,沒有開發經驗。去年在分布式的項目中,我需要在centos環境下部署分布式組件,常用一些基礎的命令,比如:
cd 到一個路徑下;
ll 查看當前路徑下的內容;
chown 修改許可權;
ps -aux | grep 查看進程信息;
cat 、 vim 等查看、修改文件內容。我常用的一些 vim 快捷鍵:
dd 刪除當前行;
gg 定位到文件頭部;
1$ 、 2$ 、 3$ 定位到當前行、第二行、第三行尾部。

有的面試官:(漏出滿意的笑容)不錯。(改問其他部分的問題)

還有的面試官: shell 命令熟悉嗎?

我:接觸過,有幾次需要編寫簡單的shell腳本進行自動化測試,當時用的是 base shell ,但是只用過一兩次,具體怎麼寫想不起來了,如果要用的話需要查一下 。

面試官:哦~能查出來是吧,可以。

總之,對於來不及准備情況,在被問到時主動把自己會的噼里啪啦說出來,可以避免被動提問然後答不上來的尷尬情況。而且會讓面試官覺得你掌握得不錯。我網路三面都被問到Linux,我都用了這一套回答過關,旁聽的同學都聽樂了。

當然這只是一個應對面試的小套路,真正學習和掌握Linux對於工作中是不可避免的一步。投機取巧只能應付一時,不要本末倒置哦。

㈧ 分享70個經典的 Shell 腳本面試題與答案

1) 如何向腳本傳遞參數 ?

./script argument

2) 如何在腳本中使用參數 ?

第一個參數 : $1 ,第二個參數 : $2

cp $1 $2

3) 如何計算傳遞進來的參數 ?

$#

4) 如何在腳本中獲取腳本名稱 ?

$0

5) 如何檢查之前的命令是否運行成功 ?

$?

6) 如何獲取文件的最後一行 ?

tail-1

7) 如何獲取文件的第一行 ?

head-1

8) 如何獲取一個文件每一行的第三個元素 ?

awk'{print $3}'

9) 假如文件中每行第一個元素是 FIND,如何獲取第二個元素

awk'{ if ($1 == "FIND") print $2}'

10) 如何調試 bash 腳本

將 -xv 參數加到 #!/bin/bash 後

例子:

#!/bin/bash –xv

11) 舉例如何寫一個函數 ?

12) 如何向連接兩個字元串 ?

輸出

HelloWorld

13) 如何進行兩個整數相加 ?

14) 如何檢查文件系統中是否存在某個文件 ?

15) 寫出 shell 腳本中所有循環語法 ?

for 循環 :

while 循環 :

until 循環 :

16) 每個腳本開始的 #!/bin/sh 或 #!/bin/bash 表示什麼意思 ?

這一行說明要使用的 shell 。 #!/bin/bash 表示腳本使用 /bin/bash 。對於 python 腳本,就是 #!/usr/bin/python 。

17) 如彎棚何獲取文本文件的第 10 行 ?

head -10 file|tail -1

18) bash 腳本文件的第一個符號是什麼

#

19) 命令: [ -z "" ] && echo 0 || echo 1 的輸出是什麼

0

20) 命令 「export」 有什麼用 ?

使變數在子 shell 中可用。

21) 如何在後台運行腳本 ?

nohup command&

大部分時間我們可能是遠程使用Linux,我碰到過由於網路斷線使得在後台運行的 command & 沒了...

22) "chmod 500 script" 做什麼 ?

使腳本所有者擁有可執行許可權。

23) ">" 做什麼 ?

重定向輸出流到文件或另一個流。

24) & 和 && 有什麼區別

25) 什擾缺么時候要在 [ condition ] 之前使用 「if」 ?

當條件滿足時需要運行多條命令的時候。

26) 命令: name=John && echo "My name is $name" 的輸出是什麼

My name is John

27) bash shell 腳本中哪個符號用於注釋 ?

#

28) 命令: echo ${new:-variable} 的輸出是什麼

variable

29) ' 和 " 引號有什麼區別 ?

30) 如何在腳本文件中重定向標准輸出和標准錯誤流到 log.txt 文埋李則件 ?

在腳本文件中添加 "exec >log.txt 2>&1" 命令。

31) 如何只用 echo 命令獲取字元串變數的一部分 ?

例子:

32) 如果給定字元串 variable="User:123:321:/home/dir" ,如何只用 echo 命令獲取 home_dir ?

echo ${variable#*:*:*:}

echo ${variable##*:}

33) 如何從上面的字元串中獲取 「User」 ?

echo ${variable%:*:*:*}

echo ${variable%%:*}

34) 如何使用 awk 列出 UID 小於 100 的用戶 ?

awk -F: '$3<100' /etc/passwd

35) 寫程序為用戶計算主組數目並顯示次數和組名

36) 如何在 bash shell 中更改標準的域分隔符為 ":" ?

IFS=":"

37) 如何獲取變數長度 ?

${#variable}

38) 如何列印變數的最後 5 個字元 ?

echo ${variable: -5}

39) ${variable:-10} 和 ${variable: -10} 有什麼區別?

40) 如何只用 echo 命令替換字元串的一部分 ?

echo ${variable//pattern/replacement}

41) 哪個命令將命令替換為大寫 ?

tr '[:lower:]' '[:upper:]'

42) 如何計算本地用戶數目 ?

wc -l /etc/passwd|cut -d" " -f1 或者 cat /etc/passwd|wc -l

43) 不用 wc 命令如何計算字元串中的單詞數目 ?

44) "export $variable" 或 "export variable" 哪個正確 ?

export variable

45) 如何列出第二個字母是 a 或 b 的文件 ?

ls -d ?[ab]*

46) 如何將整數 a 加到 b 並賦值給 c ?

47) 如何去除字元串中的所有空格 ?

echo $string|tr -d " "

48) 重寫這個命令,將輸出變數轉換為復數: item="car"; echo "I like $item" ?

item="car"; echo "I like ${item}s"

49) 寫出輸出數字 0 到 100 中 3 的倍數(0 3 6 9 …)的命令 ?

for i in {0..100..3}; do echo $i; done

for (( i=0; i<=100; i=i+3 )); do echo "Welcome $i times"; done

50) 如何列印傳遞給腳本的所有參數 ?

echo $*

echo $@

51) [ $a == $b ] 和 [ $a -eq $b ] 有什麼區別

52) = 和 == 有什麼區別

53) 寫出測試 $a 是否大於 12 的命令 ?

[ $a -gt 12 ]

54) 寫出測試 $b 是否小於等於 12 的命令 ?

[ $b -le 12 ]

55) 如何檢查字元串是否以字母 "abc" 開頭 ?

[[ $string == abc* ]]

56) [[ $string == abc* ]] 和 [[ $string == "abc*" ]] 有什麼區別

57) 如何列出以 ab 或 xy 開頭的用戶名 ?

egrep "^ab|^xy" /etc/passwd|cut -d: -f1

58) bash 中 $! 表示什麼意思 ?

後台最近執行命令的 PID.

59) $? 表示什麼意思 ?

前台最近命令的結束狀態。

60) 如何輸出當前 shell 的 PID ?

echo $$

61) 如何獲取傳遞給腳本的參數數目 ?

echo $#

62) $* 和 $@ 有什麼區別

63) 如何在 bash 中定義數組 ?

array=("Hi" "my" "name" "is")

64) 如何列印數組的第一個元素 ?

echo ${array[0]}

65) 如何列印數組的所有元素 ?

echo ${array[@]}

66) 如何輸出所有數組索引 ?

echo ${!array[@]}

67) 如何移除數組中索引為 2 的元素 ?

unset array[2]

68) 如何在數組中添加 id 為 333 的元素 ?

array[333]="New_element"

69) shell 腳本如何獲取輸入的值 ?

a) 通過參數

./script param1 param2

b) 通過 read 命令

read -p "Destination backup Server : " desthost

70) 在腳本中如何使用 "expect" ?

㈨ Linux系統工程師面試題附答案(2)

Linux系統工程師面試題(附答案)

prefork的特點是:(預派生)

1.這種模式可以不必在請求到來時再產生新的進程,從而減小了系統開銷

2.可以防止意外的內存泄漏

3.在伺服器負載下降的時候會自動減少子進程數

worker的特點是:支持混合的多線碰攔攔程多進程的多路處理模塊

如果對於一個高流量的HTTP服務 器,worker MPM是一個比較好的選擇,因為worker MPM佔用的內存要比prefork要小。

15.名詞解釋 HDLC,VTP,OSPF,RIP,DDOS,system V,GNU,netscreen,ssh,smartd,apache,WAIT_TIME 等等。

16.編寫shell腳本獲取本機的網路地址。比如:本機的ip地址是:192.168.100.2/255.255.255.0,那麼它的網路地衡御址是

192.168.100.1/255.255.255.0

方法一:

#!/bin/bash

#This script print ip and network

file=”/etc/sysconfig/network-scripts/ifcfg-eth0″

if [ -f $file ] ;then

IP=`grep “IPADDR” $file|awk -F”=” ‘{ print $2 }’`

MASK=`grep “NETMASK” $file|awk -F”=” ‘{ print $2 }’`

echo “$IP/$MASK”

exit 1

fi

方法二:

#!/bin/bash

#This programm will printf ip/network

#

IP=`ifconfig eth0 |grep ‘inet ‘ |sed ‘s/^.*addr://g’|sed ‘s/ Bcast.*$//g’`

NETMASK=`ifconfig eth0 |grep ‘inet ‘|sed ‘s/^.*Mask://g’`

echo “$IP/$NETMASK”

exit

17.在命令行下發一郵件,發件人:[email protected], 收信人:[email protected]

二、簡述題:

1.linux下如何改IP,主機名,DNS

2.linux下如何添加路由

3.簡述linux下編譯內核的意義與步驟

4.簡述Linux啟動過程

5.簡述DDOS攻擊的原理

6.簡述Tcp三次握手的過程

7.簡述VPN,常見有哪幾種?

三、設計題:

1.系統設計

請考慮以下系統的設計. 您可以翻閱資料,查詢任何您有幫助的資料、指南等。

您有的資源:

8台安裝Linux (2.6內核) 的雙網卡PC伺服器以及相關開源軟體,交換機

Apache 2.2.x

Tomcat 5.5.X

資料庫系統

最多8個Internet IP地址,請您設計一個系統:

1、使用雙apache web server前端;

2、採用AJP連接後段的3台Tomcat應用伺服器,這些tomcat被配置成cluster, 因此需要考慮apache對後端笑胡的分配,分配採用完全平衡的方法;配置使用cookie來實現session stickness;

3、1台資料庫伺服器只有tomcat才需要連接,也不需要對Internet提供服務。

4、考慮系統的安全性和維護方便性;

5、通過rewrite規則配置把下屬URL規則改寫成友好的URL

http://server/webapp/getinfo?id=XXXX&name=YYYY –> http://server/getinfo/YYYY/XXXX

您需要提交

1、伺服器規劃,包括:

*網路結構圖

*每台機器的IP地址分配

*每台機器上運行的關鍵軟體

*您從安全性和維護性方面的考慮

2、Apache的以下配置文件給我們:

*extra/http-proxy-ajp.conf

*extra/http-rewrite.conf

2.你可以採取任何設備和不同操 作系統伺服器設計對兩台WWW伺服器和兩台FTP伺服器做負載均衡,用網路拓撲圖表示並加以說明!(方法越多越好)

第一種方法: DNS輪巡

www1 IN A 192.168.1.1

www2 IN A 192.168.1.2

www3 IN A 192.168.1.3

ftp1 IN A 192.1.1.4

ftp2 IN A 192.1.1.5

ftp3 IN A 192.1.1.6

www IN CNAME www1

www IN CNAME www2

www IN CNAME www3

ftp IN CNAME ftp1

ftp IN CNAME ftp2

ftp IN CNAME ftp3

;

㈩ Shell腳本編程實戰

做 Java 的肯定都接觸過 Linux 系統,那麼很多時候我們在開發的過程中都是把我們項目打成一個jar包,或者是war包的形式,然後通過 XFTP 上傳到我們伺服器的指定目錄,然後運行一端啟動腳本,讓我們的項目變得可以訪問 就像 ./sh service.sh start 然後啟動我們寫好的 sh 的shell腳本。接下來我們就來學習一下關於 Shell 腳本是如何寫出來的。

Shell 腳本是什麼?Shell是一個命令解釋器,它的作用是解釋執行用戶輸入的命令及程序等,也就是說,我們用戶每輸入一條命令,Shell 就會相對應的執行一條命令。當命令或程序語句不在命令行下執行,而是通過一個程序文件來執行時,該程序文件就被稱為Shell腳本。

在我們的 Shell 腳本中,會有各種各樣的內容,賦值,計算,循環等一系列的操作,接下來我們就來看看這個 Shell 腳本怎麼寫吧

1.查看自己當前系統默認的 Shell

echo $SHELL

輸出:/bin/bash

2.查看系統支持的Shell

cat /etc/shells

輸出:

/bin/sh /bin/bash /usr/bin/sh /usr/bin/bash

也就是說,我們的雲伺服器是支持我們在這里給他安排 Shell 腳本的

我們這時候先來安排一下 sh 的文件,創建一個文件夾,然後在其中創建一個 sh 的文件。

mkdir /usr/local/shelltest

touch test.sh

創建完成我們編輯一下內容

vim test.sh

然後我們出來運行一下我們的 Shell 的第一個腳本

bash test.sh

出來的結果是 Hello World Shell

一個及其簡單的腳本出現了,接下我們就分析一波我們寫了點啥?

#!/bin/bash

#! 是一個約定的標記,它告訴系統這個腳本需要什麼解釋器來執行,即使用哪一種 Shell

我們在之前也使用了 echo $SHELL 來查看了自己系統默認的是哪一種 sh 解析器,之前看到的是/bin/bash,所以我們在寫 Shell 腳本的時候,我們在開頭默認的約定中,我們寫了這個是用 /bin/bash 來進行解釋的,

那麼我們如何像之前調用我們的當前目錄中的 Shell 腳本一樣去調用他呢?就像這個樣子的 ./sh service.sh start

1.授權,

我們先不授權試一下看看能通過 ./test.sh 進行調用么

bash: ./test.sh: Permission denied 會提示這個,也就是沒有授權定義,

授權命令:chmod +x test.sh

2.執行 ./test.sh

然後調用就能正常輸出了,就是說,在當前的目錄下執行這個腳本命令。

變數命名實際上很簡單,我們先來試一下

name=yikeji

這時候我們怎麼使用變數呢?實際上只要在前面加上一個符號就可以 $

echo $name

上面的兩種寫法都是可以的,外面的大括弧加和不加區別不大,可以省略,直接就 $name 就可以使用你定義的變數

使用括弧的意義一般在於區別某些變數,比如你寫了一串的內容,可能寫的是 echo $nameismyfriend ,如果連在一起,是不是有點尷尬,這時候就可以使用括弧區別一下, echo ${name}ismyfriend 不使用括弧的時候,他就去找nameismyfriend這個變數了,就無法出來我們要的效果。

unset name

這時候我們就把我們剛才定義的 name=yikeji 這個變數給去掉了,我們可以調用一下我們的變數看是什麼?

echo $name

這是不是就證明我們自己定義的變數已經刪除了

那麼我們需要一個關鍵字,大家肯定能想到是什麼關鍵字 readonly

我們先給name賦值,然後使用 readonly 設置只讀,然後再改變一下試試,

竟然是真的,如果不設置只讀,是不是會重新可以進行賦值,我們測試個年齡,

所以我們就可以肯定,readonly就是設置只讀的關鍵詞,記住了么?

那麼設置只讀的變數可以刪除么?畢竟總有杠精的面試官會提問這個棘手的問題,但是,阿粉試過的所有方式好像都是不行的,阿粉就直接重啟了自己的伺服器,這樣臨時的變數就不存在了!

說真的,Shell腳本的流程式控制制數一般才是yyds,為什麼這么說,因為你在寫大部分的腳本的時候,流程式控制制的地方永遠是最多的,判斷,選擇,等等一系列的函數,當時熟練使用的時候,就發現這東西確實很有意思。

我們先說最簡單的 if else 這也是我們最經常使用的判斷,在寫 Shell 腳本的時候,就不像我們的 Java 中直接寫

Xshell 中的語法就不是這個樣子的, Xshell 語法:

末尾的 fi 就是 if 倒過來拼寫,我們可以寫一個 if 的腳本試一下這個流程能否理解。

這里申明一下,

我們在上面這段腳本中寫就是內容就是,我們給腳本傳入一個值,然後比對這個值和2的大小關系,然後輸出我們指定的內容。

運行後就能看到

$1 表示我們給 Shell 腳本輸入的第一個參數, $0 就是你寫的shell腳本本身的名字,$2 是我們給 Shell 腳本傳的第二個參數

大家在部署某些項目的時候,是不是啟動命令就很簡潔,就是 sh service.sh start 類似這種的,那我們來看看一般這種是怎麼寫的,這就用到了另外一塊的內容,和 if 類似,在 Java 中也有,那就是 Case .

我們先來看看 Case 的語法,

case ... esac 實際上就和 Java 中的 Case 是非常相似的,case 語句匹配一個值與一個模式,如果匹配成功,執行相匹配的命令. esac 是一個結束的標志。

光說不練,假把式,我們來搞一下試試寫一個腳本來搞一下。就用我們剛才說的 sh servic.sh start 來進行測試。

我們來看看運行結果

那麼這段 Shell 腳本是什麼意思呢?其實很簡單,匹配我們傳入的第一個字元,和 start 還有 stop 進行比較,如果匹配上之後,輸出命令,最後退出即可。

是不是感覺沒有那麼復雜了呢?

說到流程式控制制,那麼肯定不能不說 for , 畢竟 for 循環在 Java 中那可是重頭戲。

我們先看他的格式

那麼我們有沒有說像是 Java 中那種 for 循環一樣的方式呢?比如說這個 for ((i=1; i<=j; i++))

實際上也是支持這種的,我們來寫一個試試。

執行一下看看

既然有 for 那是不是就有 while 呢?是的,沒錯,確實是有 while ,也是循環的意思,但是寫法有略微不一樣的地方

我們來舉個嘗試列印九九乘法表來看一下

是不是也挺簡單的?

其實 Shell 腳本的編寫一般都是在實際應用中提升,單純的寫測試腳本,也是可以讓自己對知識的掌握比較充分,而我們一般都是寫一些比較簡單的腳本,復雜的不是還有運維么?