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

實驗四 shell編程(2)

ase 編寫 img 字符串匹配 常用 rand 分享圖片 參數 RR

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

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

技術分享圖片

重新登陸之後ps1值恢復默認值。

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

技術分享圖片

若賦值的字符串中有空格時需要用雙引號或者單引號括起來。

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

① ${likes[*]}:顯示likes數組中所有非空元素

② ${likes[@]}:顯示likes數組中所有非空元素

③ ${#likes[*]}:顯示likes數組中所有非空元素的個數

④ ${#likes[@]}:顯示likes數組中所有非空元素的個數

⑤ ${#likes}:顯示likes數組中所有元素的個數

⑥ ${#likes[0]}:顯示likes數組第一個元素

技術分享圖片

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

${name:-hello}:若name不為空,輸出name的值,若name為空,輸出hello.

第一次顯示時,name不為空,所以顯示name的值,第二次因為unset name取消了賦值操作,所以name值為空,顯示hello。

技術分享圖片

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

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

${name%%.*}:從末尾開始往前尋找,去除name中所有以”.”開頭的字符串中長度最大的字符串(.tar.gz)並輸出修改後的

name

${name%.*}:從末尾開始往前尋找,去除name中所有以”.”開頭的字符串中長度最小的字符串(gz)並輸出修改後的name

技術分享圖片

技術分享圖片

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

${name#*/}從開頭開始往後尋找,去除name中所有以”/”結尾的字符串中長度最大的字符串(/usr/bin/ /etc/apt/)並輸出修改後的name

${name##*/}從開頭開始往後尋找,去除name中所有以”/”結尾的字符串中長度最小的字符串(/ /)並輸出修改後的name

技術分享圖片

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

address=‘http://www.cnblogs.com/xyz/p/8569001.html‘

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

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

技術分享圖片

echo ${address%%/p*}:從末尾開始往前尋找,去除address中所有以”/p”開頭的字符串中長度最大的字符串(/p/8569001.html).

2. shell 腳本分析

在這裏貼上虛擬機下ubuntu系統怎麽和windows系統共享文件夾的教程:

https://jingyan.baidu.com/album/2fb0ba40541a5900f2ec5f07.html?picindex=8

之前都是照著老師代碼敲得,這次通過網上教程學會了如何共享文件夾。

共享文件夾目錄路徑:/mnt/bdshare

一.

技術分享圖片

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

逆序輸出輸入字符

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

cmd="$cmd \$$count" : 循環連接echo $count

count=`expr $count - 1` : 參數數量-1

eval $cmd : eval命令將會首先掃描命令行進行所有的替換,然後再執行命令。替換完$表達式的值後,輸出結果。

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

2,3.

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

echo $3

二。

技術分享圖片

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

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

② line8~10 功能?

向第一個參數對應的用戶發送信息hello

三。

技術分享圖片

技術分享圖片

功能:將該目錄下所有以.sh結尾的文件的內容復制到添加了時間後綴的新文件中。

四。

結果顯示不出來。

① line4-10 中函數NL 的功能?

讀取文件並且line自增之後再輸出line。

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

執行NL函數

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

將輸入串所輸入的所有參數按照從前到後的順序把所有內容連接起來,並且輸出。

3.shell腳本編寫

(1)

#!/bin/bash

  count=$#

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

  do

    eval cp \$$i $1

  done

(2)

#!/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)

#!/bin/bash

for file in *.c;do

mv $file /home/huxingheng/cfile

done

ls -S /home/huxingheng/cfile

(4)

#!/bin/bash

echo -n "please input a string: "

read str

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

(5)

#!/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

實驗心得:這次實驗花費了很多時間,許多之前的知識早已遺忘,很多常用命令都是去翻閱以前的資料再去理解。其中還有個別題目實在是自己想不明白,去看了同學的博客才搞懂。現在也快到期末考試了,整體來說,對於這門課的學習掌握情況相比之前學期的課程並不是很好,期末復習還需努力,雖說本身對於這門課的目標就是入門,但感覺自己目前水平尚未達到入門要求。

實驗四 shell編程(2)