本次試題全部都是寫腳本,一共有十道題,說是面試,其實都是基礎的東西,enjoy it~
1、編寫個shell腳本将目前目錄下大于10K的檔案轉移到/tmp目錄下。
1
2
3
4
5
6
7
8
9
10
11
<code>#Author:Name</code>
<code>#E-mail:E-mail Address</code>
<code>#Description:Move some files #寫程式的時候加上姓名,聯系方式和描述是一個好習慣。</code>
<code>#!/bin/bash</code>
<code>ls</code> <code>-l|</code><code>awk</code> <code>'$5>10240 {print $9}'</code> <code>>name.txt </code><code>#先把大于10K的檔案名都儲存到name.txt的檔案</code>
<code>for</code> <code>filename </code><code>in</code> <code>$(</code><code>cat</code> <code>name.txt) </code><code>#for循環,注意$()</code>
<code> </code><code>do</code>
<code> </code><code>mv</code> <code>$filename </code><code>/tmp</code>
<code> </code><code>echo</code> <code>$filename </code><code>"is ok."</code>
<code> </code><code>done</code>
<code>ls</code> <code>/tmp</code>
【評析】第一套裡的第十題跟這道題是一樣的,bash是可以使用find語句的,那樣寫比較省事。而且要注意像答案那麼寫的話,檔案夾也是有可能被選中,但是不用擔心,檔案夾不會被mv,會提示“略過目錄”。
2、編寫shell腳本擷取本機的網絡位址。
<code>#Auther:ChrisChan</code>
<code>#E-mail:[email protected]</code>
<code>#Description:Check IP address and Netmask</code>
<code>IP=$( </code><code>ifconfig</code> <code>eth0|</code><code>grep</code> <code>inet|</code><code>head</code> <code>-1|</code><code>cut</code> <code>-d : -f 2|</code><code>sed</code> <code>'s/Bcast//g'</code> <code>)</code>
<code>echo</code> <code>"這台機器的IP位址是"</code><code>$IP</code>
<code>NETMASK=$( </code><code>ifconfig</code> <code>eth0|</code><code>grep</code> <code>inet|</code><code>head</code> <code>-1|</code><code>cut</code> <code>-d : -f 3|</code><code>sed</code> <code>'s/Mask//g'</code> <code>)</code>
<code>echo</code> <code>"這台機器的網關是"</code><code>$NETMASK</code>
【評析】一條指令,用三個方法去不斷的縮小範圍,直到最後确定那幾個數字。
12
<code>#Description:Jurde a file is a c-file or not</code>
<code>read</code> <code>-t 10 -p </code><code>"請輸入一個檔案名:"</code> <code>Fname</code>
<code>if</code> <code>[ -c $Fname ]</code>
<code> </code><code>then</code>
<code> </code><code>cp</code> <code>$Fname </code><code>/dev</code>
<code> </code><code>else</code>
<code> </code><code>echo</code> <code>"WRONG!"</code>
<code> </code><code>exit</code> <code>88</code>
<code>fi</code>
【評析】給一個變量指派有兩種方法,一種就是上面列出的read -p的形式,還有一種是這樣的
<a href="http://s2.51cto.com/wyfs02/M00/80/6A/wKiom1dAazrg_AzcAAA7WN0jQ3A251.png" target="_blank"></a>
4.請為下列shell程式添加注釋,并說明程式的功能和調用方法:
13
14
15
16
17
18
19
20
21
22
23
<code>#!/bin/sh #這是一個bash語言</code>
<code># /etc/rc.d/rc.httpd #啟動Apache</code>
<code># Start/stop/restart the Apache web server. #啟動/停止/重新開機Apache</code>
<code># To make Apache start automatically at boot, make thisfile executable: chmod 755 /etc/rc.d/rc.httpd #若要apache開機自啟動,就要讓rc.httpd這個檔案有755</code>
<code>case</code> <code>"$1"</code> <code>in</code>
<code> </code>
<code>'start'</code><code>) </code><code>#若第一個變量是start</code>
<code>/usr/sbin/apachectl</code> <code>start ;; </code><code>#apache就啟動</code>
<code>'stop'</code><code>) </code><code>#若第一個變量是stop</code>
<code>/usr/sbin/apachectl</code> <code>stop ;; </code><code>#apache就停止</code>
<code>'restart'</code><code>) </code><code>#若第一個變量是restart</code>
<code>/usr/sbin/apachectl</code> <code>restart ;; </code><code>#apache就重新開機</code>
<code>*) </code><code>#若第一個變量不是上面的任意一個</code>
<code>echo</code> <code>"usage $0 start|stop|restart"</code> <code>;; </code><code>#提示操作人員</code>
<code>esac</code> <code>#結構結束,這是case的反寫</code>
功能就是控制apache程式的,調用方法就是啟動/停止/關閉
5、設計一個shell程式,添加一個新組為class1,然後添加屬于這個組的30個使用者,使用者名的形式為stdxx,其中xx從01到30。
開頭略
<code>!</code><code>#/bin/sh #解釋器是sh</code>
<code>groupadd class1 </code><code>#建立一個群組</code>
<code>i=1</code>
<code>while</code> <code>[ i -</code><code>le</code> <code>30 ]</code>
<code> </code><code>do</code>
<code> </code><code>if</code> <code>[i -</code><code>le</code> <code>9 ]</code>
<code> </code><code>Username=std0$i</code>
<code> </code><code>else</code>
<code> </code><code>Username=std$i</code>
<code> </code><code>fi</code>
<code> </code><code>Useradd $Username</code>
<code> </code><code>mkdir</code> <code>/home/</code><code>$Username</code>
<code> </code><code>chown</code> <code>-R $Username </code><code>/home/</code><code>$Username </code><code>#-R是改變使用者和群組</code>
<code> </code><code>chgrp</code> <code>-R class1 </code><code>/home/</code><code>$Username</code>
<code> </code><code>let</code> <code>i =i+1 </code><code>#我喜歡用這個疊加,簡單粗暴還好用但是要注意格式。</code>
<code>done</code>
6、編寫shell程式,實作自動删除50個賬号的功能。賬号名為stud1至stud50。
#開頭省略
<code>while</code> <code>[ $i -</code><code>le</code> <code>50 ]</code>
<code> </code><code>userdel -r stud$i </code><code>#這裡使用stud${i}</code>
<code> </code><code>let</code> <code>i=i+1</code>
7.某系統管理者需每天做一定的重複工作,請按照下列要求,編制一個解決方案:
(1)在下午4 :50删除/abc目錄下的全部子目錄和全部檔案;
(2)從早8:00~下午6:00每小時讀取/xyz目錄下x1檔案中每行第一個域的全部資料加入到/backup目錄下的bak01.txt檔案内;
(3)每逢星期一下午5:50将/data目錄下的所有目錄和檔案歸檔并壓縮為檔案:backup.tar.gz;
(4)在下午5:55将IDE接口的CD-ROM解除安裝(假設:CD-ROM的裝置名為hdc);
(5)在早晨8:00前開機後啟動。
#crontab -e先
(1)50 16 * * * rm -rf /abc/*
(2)1 8-18/1 * * * cut /xyz/x1 -f 1 >>/backup/bak01.txt
(3)50 17 * * 1 tar zcvf backup.tar.gz /data
(4)55 17 * * * umount /dev/hdc
(5)這個需要在root使用者登入的前提下操作, 而且這題出的有問題,不知道要啟動什麼。
【評析】每個使用者都會生成一個自己的crontab檔案,這個檔案一般位于/var/spool/cron,這個檔案裡的計劃任務是專門針對于root這個使用者的,如果使用#crontab -r那就會删除掉目前使用者的crontab的檔案。
8、有一普通使用者想在每周日淩晨零點零分定期備份/user/backup到/tmp目錄下,該使用者應如何做?
crontab -e
0 0 * * 0 cp /user/backup /tmp
【評析】五個*裡最後一個*的取值範圍是0~7,其中0和7都是代表星期天,可以寫成sun,/etc/crontab的文檔原話是這麼寫的:day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
9、設計一個Shell程式,在/userdata目錄下建立50個目錄,即user1~user50,并設定每個目錄的權限,其中其他使用者的權限為:讀;檔案所有者的權限為:讀、寫、執行;檔案所有者所在組的權限為:讀、執行。
<code>#開頭略</code>
<code>#!/bin/bash </code>
<code>while</code> <code>[ i -</code><code>le</code> <code>50 ]</code>
<code> </code><code>mkdir</code> <code>-p -m 764 </code><code>/userdata/user</code><code>$i</code>
<code> </code><code>echo</code><code>"第"</code><code>$i</code><code>"個目錄已經生成,權限是764."</code>
<code> </code><code>let</code> <code>i=i+1</code>
【評析】mkdir -p是遞歸生成目錄,再加上-m 就是在生成目錄的時候直接賦予權限。
如果要是使用mkdir下生成一個樹形的目錄,mkdir -vp BBB/{CCC/,EEE/{FFF/,GGG/},KKK/,III/{OOO/,PPP/}},這樣生成了一個樹形檔案。
如果隻是在/userdata/下生成user1~user50的檔案,其實不用那麼費勁,#cd /userdata/ && touch user{1..50}即可。
10、設計一個shell程式,在每月第一天備份并壓縮/etc目錄的所有内容,存放在/root/bak目錄裡,且檔案名為如下形式yymmdd_etc,yy為年,mm為月,dd為日。Shell程式fileback存放在/usr/bin目錄下。
做一個腳本先
#cd /usr/bin
#vim fileback.sh
<code>YY=$( </code><code>date</code> <code>+ %y )</code>
<code>MM=$( </code><code>date</code> <code>+ %m )</code>
<code>DD=$( </code><code>date</code> <code>+ %d ) </code><code>#注意格式,注意格式~</code>
<code>tar</code> <code>-zcvf </code><code>/root/bak/</code><code>$YY$MM$DD </code><code>/etc/</code><code>* </code><code>#将/etc目錄下的所有檔案都打包壓縮成etc.bak檔案</code>
儲存之後,添加計劃任務
#crontab -e
1 1 1 * * sh /usr/bin/fileback.sh
本文轉自 蘇幕遮618 51CTO部落格,原文連結:http://blog.51cto.com/chenx1242/1743037