軟件學院第三次系統編程上機
先把題目和百度到的參考資料粘過來吧orz
弱智答案等ddl過了再粘上來
系統編程第三次實驗
實驗目的
掌握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
輸出重定向:
命令 > 文件名 , 比如 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 #這裏有分號,同一行需要分號,可以參考前面命令連接符。或者把then放到下一行
...
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個值,禁止打表輸出。
3. 完成一個簡單的交互設計,根據用戶輸入輸出對應內容,具體交互內容隨意,要求至少用上select,case和read。
4. ls -l /boot/grub2 && cat /boot/grub2/grub.cfg | more,解釋此條命令含義。
5. 在腳本中通過管道+一些命令使得腳本自動提權,而不是輸入密碼提權,可能用到的命令echo、sudo、su。
6. 設計一個函數,輸入一個字符串,要求輸出字符串第3位~末尾的字串。
軟件學院第三次系統編程上機