1. 程式人生 > >實驗四:shell編程(2)

實驗四:shell編程(2)

AR shift ber AC info 作用 name source 幫助信息

1. shell 變量基本用法及常用符號使用

此部分要求寫出實現相應要求的 shell 命令,截圖顯示

(1)將主提示符改為用戶的主目錄名

技術分享圖片

(2)將字符串 DOS file c:>\$student\*賦值給變量 x,並顯示出來

技術分享圖片

(3) shell 命令終端輸入 likes=(cosmos galaxy moon); likes[6]=mars然後使用 echo 分別顯示以下表達式的值並結合結果寫出表達式的作用。

${likes[*]} ${likes[@]} ${#likes[*]} ${#likes[@]} ${#likes}

${#likes[0]}

${likes[*]}:得到非空數組元素

${likes[@]}:得到非空數組元素

${#likes[*]}:得到數組中非空元素的個數

${#likes[@]}:得到數組中非空元素的個數

${#likes}:得到數組中下標為0的元素的長度

${#likes[0]}:得到數組中下標為0的元素的長度

截圖如下:

技術分享圖片

(4) shell 命令終端輸入name=Phoenix然後使用echo 顯示表達式觀察結果然後輸入命令unset name再輸入表達式觀察結果。結合兩次結果,寫出表達式的作用。

${name:-hello}

表達式作用:如果name變量不為空,取變量name的值,否則取值為hello

截圖如下:

技術分享圖片

(5)在 shell 命令終端輸入 name=‘/usr/share/doc/apg/php.tar.gz‘,然後使用 echo 分別顯示表達式的值,觀察結果。

修改 name 的值,讓 name=‘/etc/apt/sources.list.d‘,再次使用 echo 分別顯示表達式的值,觀察結果。結合結果,寫出表達式的作用。

${name%%.*} ${name%.*}

${name%%.*}:name值的末尾如果和‘.’匹配,去掉最多匹配的部分,剩下的即為表達式的值

${name%.*}:name的值如果和‘.’匹配,去掉最少匹配的部分,剩下的即為表達式的值

截圖如下:

技術分享圖片

技術分享圖片

(6)在 shell 命令終端輸入 name=/usr/bin/X11,然後使用 echo 分別顯示表達式的值,觀察結果。修改 name 的值,讓 name=‘/etc/apt/sources.list.d‘,再次使用 echo 分別顯示表達式的值,觀察結果。結合結果,寫出表達式的作用。

${name#*/} ${name##*/}

(提示:參考教材 4.6.3 節)

${name#*/}:如果name值的開頭與‘/’匹配,則去掉匹配最少的部分,剩下的即為表達式的值

${name##*/}:如果name值的開頭與‘/’匹配,則去掉匹配最多的部分,剩下的即為表達式的值

截圖如下:

技術分享圖片

技術分享圖片

7)已知某同學提交的博客文章頁面地址 address 如下:

address=‘http://www.cnblogs.com/xyz/p/8569001.html‘ 通過字符串匹配,如何得到其博客主頁地址: homepage=‘http://www.cnblogs.com/xyz‘

寫出由變量 address 得到變量 homepage 的 shell 命令實現。

使用一次homepage=${address%/*};homepage=${homepage%/*}便可以得到博客的主頁地址了

截圖如下:

技術分享圖片

2. shell 腳本分析

(1)使用 vim/gedit 編寫 shell 腳本文件 ex1.sh,其內容如下:

在 shell 命令終端分 3 次運行該腳本,觀察其運行結果。

① 第 1 次運行:. ex1.sh

② 第 2 次運行:. ex1.sh best wishes

③ 第 3 次運行:. ex1.sh god bless u

結合 3 次運行結果,分析腳本代碼,在實驗報告中總結以下內容:

① 整個 shell 腳本的功能是什麽?

將輸入的字符串按逆序輸出,循環次數為輸入參數的個數

② 第 8 行、第 9 行、第 11 行的功能是什麽?

第8行:將$和count的值追加到cmd變量中去

第9行:count自減1

第11行:掃描兩次,第一次將$和它後面的值替換為對應位置的參數,第二次掃描執行顯示命令

③ 每次運行時,腳本中的 while 循環分別執行幾次?

2次

3次

④ 運 行. ex1.sh god bless u 時,while 循環體第 1 次被執行時,第 8 行執行後變量 cmd 的值為?

echo $3

結果截圖如下:

技術分享圖片

(2)使用 vim/gedit 編寫 shell 腳本文件 ex2.sh,其內容如下:

在命令終端輸入. ex2.sh jsj,(實際執行時,請將jsj 替換為您電腦中的登錄用戶名)結合結果及幫助信息,回答下列問題。

① line6 中,who | grep “^$1”的功能?

先查找當前用戶的用戶信息,然後再在結果中查找和輸入的第一個參數相同的用戶信息

② line8~10 功能?

將輸入串的第一個參數重定向到Limitstring 向其發送hello huxingheng,然後將查到的用戶信息顯示出來

結果截圖如下:

技術分享圖片

(3)使用 vim/gedit 編寫 shell 腳本文件 ex3.sh,其內容如下:

在命令終端輸入. ex3.sh,結合結果及幫助信息,回答下列問題。

① 截圖顯示運行結果。

技術分享圖片

③ 該腳本的功能是?

復制所有以’.sh’結尾的文件,命名方式為:原文件名+“.BACKUP—”+年+月+日+“-”+小時+分鐘

4)使用 vim/gedit 編寫 shell 腳本文件 ex4.sh,其內容如下:

shell 命令終端分 3 次運行該腳本,觀察其運行結果。

① 第 1 運行:. ex4.sh

② 第 2 運行:. ex4.sh /etc/apt/sources.list

③ 第 3 運行:. ex4.sh /etc/apt/sources.list ex4.sh

結合運行結果,分析 shell 腳本功能。回答:

line4-10 中函數 NL 的功能?

讀取文件,輸出line+1的值(這裏代指行號)和行內容

line14 中,條件測試滿足時,腳本執行的功能是?

調用函數NL,因未傳遞參數,故輸出為空,且無法終止

line17-line21,這部分腳本的功能是?

利用循環和函數NL將輸入串輸入的所有文件中的內容顯示到屏幕

(當輸入串參數不為空且輸入串參數是個文件時,調用循環,調用函數NL,傳遞的參數為第一個參數,然後銷毀第一個參數,把第二個參數作為第一個參數,接著循環)

3. shell 腳本編寫

此部分要求貼出實現相應要求的 shell 腳本程序,並截圖顯示腳本執行及結果

(1)第 4 章 思考題 4.9

程序:

#!/bin/bash

  count=$#

  for((i=2;i<=$count;i++))

  do

    eval cp \$$i $1

  done

截圖:

技術分享圖片

(2)第 4 章 思考題 4.11

程序:

#!/bin/bash

function NL() {

while read x

do

echo "$x"

done

}

if [ $# -le 1 ];then

echo "error"

else

fn=$1

while [ "$2" ] && [ -f "$fn$2" ]

do

NL < $2

shift

done

fi

截圖:

技術分享圖片

(3)第 4 章 思考題 4.12

程序:

#!/bin/bash

for file in *.c;do

mv $file /home/huxingheng/cfile

done

ls -S /home/huxingheng/cfile

截圖:

技術分享圖片

(4)第 4 章 思考題 4.18

(提示:利用 cut 命令及相應選項,考慮位置參數使用)

程序:

#!/bin/bash

echo -n "please input a string: "

read str

echo $str | cut -c $1-$2

截圖:

技術分享圖片

(5)猜數字遊戲具體要求如下:

① 寫一個函數 random0_100 生成 0~100 之間的隨機數

② 用戶從鍵盤輸入競猜數字,如果猜錯了,提示用戶所猜數字偏大或偏小,用戶繼續猜,直至猜對為止。

(提示:shell 內部系統變量 RANDOM 生成 0~32767 之間的整數隨機數)

代碼:

#!/bin/bash

read -p "please input a number between 0 and 100: " x

temp=$((RANDOM%100))

while [ $x -ne $temp ]

do

echo "fail! try it again!"

if [ $x -gt $temp ];then

read -p "please input a number smaller: " x

else

read -p "please input a number larger: " x

fi

done

if [ $x -eq $temp ];then

echo "congratulations!"

fi

截圖:

技術分享圖片

總結:這次的實驗花了很長的時間才完成它,很遺憾,沒有在考試規定的時長內完成它。做的過程中用到的知識點感覺很陌生,只有自己用的時候才發現知識點的匱乏,幾乎是邊學邊做的,雖然加深了印象,但就這樣考試肯定是不合格的,還需要加強練習和知識點的總結。

--the end--

實驗四:shell編程(2)