系统编程第三次上机
先把題目和百度到的參考資料粘過來吧orz
弱智答案等ddl過了再粘上來
一是怕錯誤的答案誤導大家,二是怕查重QAQ
實驗目的
掌握shell中管道、重定向的用法?學習shell基本語法
進階內容
注:本部分內容不作為實驗必須要求,只是作為對有興趣深入學習的同學的一些指導。
正則表達式
akw的深入學習http://www.zsythink.net/archives/tag/awk/
sed與grep
實驗環境
bash!!!!
實驗指導
1.?查看當前shell種類
在shell中輸入?echo?$shell,?輸出應當是bash。
?
如果不是,可以使用which sh ,該命令將顯示sh命令的完整路徑,?然后將通過創建軟鏈接使得sh指向bash。(強?行復習軟鏈接)
2.?重定向
Linux中默認輸入輸出分為3類:
標準輸入stdin。標準輸入文件的編號是0(牢記linux萬物皆文件),默認的設備是鍵盤,命令執行時從鍵盤讀?取數據。
標準輸出stdout。標號為1,默認的設備是顯示器,命令的輸出會被打印到屏幕上。
標準錯誤stderr。標號為2,默認的設備是顯示器,命令執行產生的錯誤信息會被發送到標準錯誤文?件。
重定向的意思就是改變這三個文件實際指向,比如我們希望從某個文件中獲取輸入,那么就需要將標準輸入指向這?個文件。 重定向后命令依然從標準輸入獲得輸入,此時標準輸入指向這個文件,故命令能夠從這個文件獲取輸?入。
輸入重定向:
命令?<?文件名?,?比如?sort?<?sp.txt?,?把sp.txt文件中的內容作為sort的輸入。
輸出重定向:
命令?>?文件名?,?比如?cat?/etc/passswd?>?ps.log?,?cat會輸出/etc/passwd中內容,但此時并不會輸出到屏?幕上,而是輸出到ps.log中。
> ?會覆蓋原文件中內容, ?>>?則會將輸出追加到原文件末尾。
錯誤重定向:
命令?2>?文件名?,比如?gcc?-c?test.c?-o?test.out?2?>?error.log,?如果gcc編譯時出現錯誤,則會把錯誤信息輸?出到error.log中。
> ?會覆蓋原文件中內容, ?>>?則會將輸出追加到原文件末尾。
其他
在重定向錯誤時使用了錯誤文件的編號2, ???其實在輸入輸出的時候也可以顯式寫0或1,通常是省略。
&運算符,表示等同于,?2>&1,表示將標準錯誤從重定向到標準輸出指向的文件。如?1>/dev/null?,然?后執行2>&1,此時都指向空設備。
3. ?管道
管道作用是將多個命令串連起來,使一個命令的輸出作為另一個命令的輸入。?命令1?|?命令2?|?命令3?....|?命令n
ls?/etc?|?grep?init?將會輸出/etc目錄下,文件名包含init的文件/目錄。 如果不使用管道,命令就得拆成: ls
/etc >?tmp grep init <?tmp rm?tmp ls?/etc?|?grep?init?>>?testcat?test
4.?命令連接符
?
命令的執行是串行的,一條命令結束才能輸入下一條命令,我們可以在命令之間加上;分割命令,從而可以一?行輸入所有命令。shell會挨個執行。
&&連接符
?
命令1 && 命令2 && 命令3?,shell在判斷出這個表達式的真假后就會停止執行。如果命令1為false,可以判斷表達式?一定為假,執行停止。如果為true,那么還需要執行命令2,一直執行到能判斷真假為止或者執行完被&&連接的命 ???令。
?
||連接符
同 ?&& ?, ?執行到能判斷真假或者所有被連接命令被執行完為止。&&和||的計算方式同c語言中的&& ?||。
4.?shell-變量
?
在shell中使用變量無需定義,在使用的時候創建。并且變量不分類型,shell統一認為是字符串,需要的時候?通過一些命令進行轉換。
變量賦值?:?變量名=值?,等號左右不能夠有空格。若字符串中包含空格,則需要用單/雙引號括起來。?可以使用readonly將變量改為只讀類型。
通過?$?引用變量值,?echo?$shell?。?輸入變量,?read?變量名?。
?
引用格式返回值
$var 返回變量值
$var 返回變量值
${#var} 返回變量值的長度
${var:start} 返回從start下標到字符串末尾的子串
${var:start:length} 返回從start下標開始,長度為length的子串
?
實際上還有一些空值判斷、字符串替換和正則匹配拆分字符串等,為了精簡篇幅,這里不再列舉,可自行查閱資料。
?
環境變量
export ?變量名, ?將一個已經存在的本地變量修改為環境變量。 export ?變量名=值,定義一個環境變量。
?
位置變量
?
在執行shell腳本的時候,可以傳入參數,如當前有個腳本叫test,?執行sh?test?arg1?arg2?arg3?,那么在test中,$0?代表腳本文件名,$1為第一個參數:arg1,以此類推。 ??使用shift可以將參數左移,此時$1為arg2,$2為arg3, ?$3為?空 ?$#為參數數量。
?
特殊參數含義
$# 傳遞到腳本的參數數量
$? 前一個命令執行情況,0成功,其他值失敗
$$ 運行當前腳本的進程id
$! 運行腳本最后一個命令
$* 傳遞給腳本或者函數的所有參數
?
5.?shell-變量運算
let
let?表達式?,?會計算此表達式,?如let?i=i+1
(())
((i+=3))
expr
echo?`expr?3?+?5`?,?這里的引號是反引號,tab上面那個鍵。
6.?shell-if
if?條件
then
....
fi
==============================
if?條件;?then?#這里有分號,同一行需要分號,可以參考前面命令連接符?;蛘甙裻hen放到下一行
...
else
...
fi?
==============================
if 條件;?then...
elif 條件;?then...
else...
fi
條件格式為:
1. ?一條完整的命令,或者用||?&&等連接的命令。
2.?字符串比較,[邏輯表達式],[?$shell?!=?"bash"?]?。如果后面字符串不含空格,這里可以不加引號,不等號?是!=。
3. ??需要注意的是, ?[]以及其他部分之前需要用空格分離,注意上面的例子,每個部分都用空格分割。
?
4.?數值比較為?[?$a?-lg?6?],?-lt為less?than,?-le為less?equal,?-eq為equal?,?-ne為not?equal,-ge為greater?than,?-?gt同理。
5.?常用文件測試為:?if?[?-d?arg ]?,如果arg是目錄則為真。-f為文件為真,-r可讀為真,-w可寫,-x可執行等。
?
6.?shell-select
交互式命令,用戶在預定的選項中選擇一個。
select 變量 ?in?列表
do
...
break?done
例子見附件
7.?shell-case
類似c中switch
case $var?in
'選項1') ...?;;
"選項2") ...?;;
選項3 )?,,,
esac
?
匹配選項可以用引號,以可以直接列出。然后加上一個 ??)。
?
7.?shell-for
?
for 變量 ?in?變量列表
do
...
done
?
例子見附件
?
8.?shell-while
?
while?[表達式]?do
...
done
?
例子見附件
?
8.?shell-until
?
until?[表達式]?do
...
done
?
例子見附件
9.?shell-函數
?
[function] 函數名?[()]
{
...
[return?int]
}
[]中內容可以省略。根據測試只能省略一個。如果不設置返回值,則返回最后指令的執行結果。
?
調用方式為?函數名?參數1?參數2
函數中變量也是全局變量,如果要定義局部變量,則在變量賦值前加上local關鍵字,如?local a=5。?在函數中,引用參數是通過$1、$2等完成,$0代表函數名。
實驗內容
1. 完成一鍵配置源的腳本,功能有,備份原有源,然后添加163或者清華源等,然后使用yum的update選項更?新。可以在腳本中加入自己常用的軟件快捷安裝命令,比如vs? code或者chrome的等等。
先進入yum源配置目錄
cd /etc/yum.repos.d
備份系統自帶的yum源
mv CentOS-Base.repo CentOS-Base.repo.save
下載yum源
163的yum源:
wget http://mirrors.163.com/.help/CentOS6-Base-163.repo
(會在/etc/yum.repos.d下生成相應的文件)
更新完yum源后,更新一下,使操作立即生效
yum makecache
用新的yum更新系統(速度快很多)
yum -y update
2. ?計算斐波那契數列,第17個值,禁止打表輸出。
shell編程建議看《Linux編程基礎》
或者博主南柯夢的5篇系列博客:https://www.cnblogs.com/dongying/p/6262935.html
3.? 完成一個簡單的交互設計,根據用戶輸入輸出對應內容,具體交互內容隨意,要求至少用上select,case和read。
同第二題
4.?ls?-l?/boot/grub2?&&?cat?/boot/grub2/grub.cfg?|?more,解釋此條命令含義。
如果自己的虛擬機中沒有這兩個目錄,不要緊。反正是解釋又不是要運行23333
&&的使用格式:command1 && command2,command1成功執行后(返回0),繼續執行command2
如果command1執行失敗(例如不存在這個目錄或沒有權限,返回非0) ,此時command2不會執行
(其實這個道理很簡單2333不是跟c語言一樣嘛,唯一的區別是c語言是判斷command的true、false,而shell編程是判斷是否成功執行)
同理,command1 && command2 && command3.....&& commandn 只要有一個執行失敗,后面的命令就不會被執行了
| 是管道,管道前的輸出作為管道后的輸入,在這里就是前兩個命令的輸出用more命令輸出
5. 在腳本中通過管道+一些命令使得腳本自動提權,而不是輸入密碼提權,可能用到的命令echo、sudo、su。
用echo輸出密碼,再通過管道把密碼輸入,從而實現不必要手動輸入密碼提權
6. 設計一個函數,輸入一個字符串,要求輸出字符串第3位~末尾的字串。
?同第二題
轉載于:https://www.cnblogs.com/PineZhuo/p/10539272.html
總結
- 上一篇: 项目管理计划包含哪些内容
- 下一篇: x79服务器主板装系统,【小白经历分享】