shell 編程(2)
1. (1)將主提示符改為用戶的主目錄名 (提示:參考教材 4.6.8 節環境變量 PS1 和 HOME 的用法)
(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中已經設置了的個數
④ ${#likes[@]} 同上
⑤ ${#likes} 數組likes中第一個元素“mars”的長度
⑥ ${#likes[0]} 同上
(4)在 shell命令終端輸入name=Phoenix,然後使用echo顯示表達式①,觀察結果;然後輸入命令unset name, 再輸入表達式①觀察結果。結合兩次結果,寫出表達式的作用。 ① ${name:-hello}
當name不為空時使用變量:-字符串賦值無效。
而unset刪除
(5)在 shell命令終端輸入name=‘/usr/share/doc/apg/php.tar.gz‘,然後使用echo分別顯示表達式①和②的值, 觀察結果。 修改 name 的值,讓 name=‘/etc/apt/sources.list.d‘,再次使用 echo 分別顯示表達式①和②的值,觀察結果。 結合結果,寫出表達式的作用。 ① ${name%%.*} ② ${name%.*}
${name%%.pattern} 和${name%.pattern}中如果pattern與name值末尾匹配,那麽name值中去掉匹配部分後就是表達式的值,否則該表達式的值就是
${name%%.pattern}中去掉部分是最多匹配的部分,只去掉了gz
${name%.pattern}中去掉的部分是最少匹配的部分,只保留了第一部分
(6)在 shell 命令終端輸入 name=/usr/bin/X11,然後使用 echo 分別顯示表達式①和②的值,觀察結果。 修改 name 的值,讓 name=‘/etc/apt/sources.list.d‘,再次使用 echo 分別顯示表達式①和②的值,觀察結果。 結合結果,寫出表達式的作用。 ① ${name#*/} ② ${name##*/}
與(5)中相似,區別在於%表示從結尾處匹配,#表示從開頭處匹配
(7)已知某同學提交的博客文章頁面地址 address 如下: address=‘http://www.cnblogs.com/xyz/p/8569001.html‘ 通過字符串匹配,如何得到其博客主頁地址: homepage=‘http://www.cnblogs.com/xyz‘ 寫出由變量 address 得到變量 homepage 的 shell 命令實現。
2.腳本分析
(1) #!/bin/bash
count=$#
cmd=echo
while [ $count -gt 0 ]
Do
cmd="$cmd \$$count"
count=`expr $count - 1`
Done
eval $cmd
①整個程序可將參數倒序輸出
在腳本ex1.sh中,$#是特殊Shell變量,指的是參數的個數。
②cmd="$cmd \$$count" $cmd為echo,\$$count表示最末一個參數,整個語句表示輸出最末一個參數
count=`expr $count - 1` 表示參數數量減一
eval $cmd表示運行cmd中的命令
③第一條命令循環0 次,第二條2次,第三條3次
④echo $3
(2)
①who | grep “^$1”的功能為判斷wll是否在當前系統存在
②line8~10的功能是將參數wll重定向到LimitString中,並發送hello。
(3)
功能為將尋找sh格式文件,將它們復制到新文件裏,新文件名字為原文件名末尾加“BACKUP--當前時間(年月日時分)...”
(4)
line4-10 功能為讀取輸入變量存入x中,在下一行輸出行號和該變量
line14 中條件滿足時腳本調用NL函數,即上述功能
line17-line21功能為將參數讀入函數NL中,shift 命令將參數左移一位,最左邊的參數丟棄。
3.腳本編寫
(1)編寫一個shell腳本,它把第二個位置參數以及其後的各個參數指定的文件復制到第一個位置參數指定的目錄中。
(2)打印給定目錄下的某些文件,由第一個參數指出文件所在的目錄,其余參數是要打印的文件名。
(3)利用for循環將當前目錄下的.c文件移到指定的目錄下,並按文件大小排序,顯示移動後指定目錄的內容
(3)設計一個程序cuts,它由標準輸入讀取數據,獲取由第一個參數n和第二個參數m所限定範圍的數據,n和m都是整數,即從輸入的字符串中抽取第n個字符至第m個字符之間的所有字符(包括這兩個字符)。例如:
$cuts 11 14
this is a test of cuts program (輸入)
test (結果)
5.猜數字遊戲,具體要求如下:
①寫一個函數random_100生成0~100之間的隨機數
②用戶從鍵盤輸入競猜數字,如果猜錯了,提示用戶所猜數字偏大或偏小,用戶繼續猜,直到猜對為止。
shell 編程(2)