1. 程式人生 > >軟件學院第三次系統編程上機

軟件學院第三次系統編程上機

tag -i font 追加 stdin col bsp 簡單 第一個

先把題目和百度到的參考資料粘過來吧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

< 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 #這裏有分號,同一行需要分號,可以參考前面命令連接符。或者把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位~末尾的字串。

軟件學院第三次系統編程上機