實機練習題

  1. 共同要求:
    1. 在家目錄下建立 zzz 目錄。
    2. 切換工作目錄到 zzz,所有練習腳本皆存在此目錄。
    3. 腳本必須宣告執行命令 /bin/bash,且可執行。
  2. 撰寫以下腳本:
    1. loop01.sh:從 1 加到由命令列第一個參數指定的數字,但必須判斷參數是大於 1 且小於 10 的數字,若不是則預設為10,假設輸入的輸字為 8,輸出範例如下:
      1+2+3+4+5+6+7+8=28
      
    2. loop02.sh:從命令列第一個參數指定的數字,加到12,但必須判斷參數是大於 1 且小於 7 的數字,若不是則預設為7,假設輸入的輸字為 5,輸出範例如下:
      5+6+7+8+9+10+11+12=68
      
    3. loop03.sh:從 1 加到由命令列第一個參數指定的數字,迴圈步階為2,但必須判斷參數是大於 1 且小於 10 的數字,若不是則預設為10,假設輸入的輸字為 8,輸出範例如下:
      1+3+5+7=16
      
    4. loop04.sh:從命令列第一個參數指定的數字,加到1,迴圈步階為-1,但必須判斷參數是大於 5 且小於 10 的數字,若不是則預設為10,假設輸入的輸字為 8,輸出範例如下:
      8+7+6+5+4+3+2+1=36
      
  3. 寫一腳本 loop1.sh 使用 for 迴圈,要求如下:
    1. 使用腳本執行的預設第一、二個參數 $1, $2 讀入兩個數字字串。
    2. 判斷字串中的每個數字,若是兩個字串在同一個位置的數字相同,則記載一個 A。
    3. 若是兩個字串都有這個數字但是位置不同,則記載一個 B。
    4. 當沒有 A 也沒有 B 時則輸出 0A0B。
    5. 輸入範例: 14685 47653,輸出結果: 14685 47653 Ans=1A2B
  4. 寫一腳本 loop2.sh 使用 while 迴圈,要求如下:
    1. 有一運算式,其運算規則為(運算子,運算元,運算元)。例如(*,3,5) 表示 3*5,結果等於 15。
    2. 運算子可為 +,-,*,/ ,運算元則是一個正或負整數,若有多重括弧,則以內部括弧先處理,每個括弧運算皆取整數。
    3. 使用腳本執行的預設第一個參數 $1 讀入一個運算式,
      例如:"(+,(*,3,5),(-,(*,2,4),6))"
      範例輸出:Ans=17
    4. 範例輸入:"(+,(-,(+,14,19),(*,-7,9)),(/,4,(/,14,12)))"
      範例輸出:Ans=100
    5. 範例輸入 "(/,0,(/,(+,-1,(*,7,(*,-7,18))),(/,-3,10)))"
      範例輸出:No solution
  5. 寫一腳本 loop3.sh 使用 until 迴圈,要求如下:
    1. 對於一個字串若起始字元為 A,最後字元為 L,且其間不含任何 A 或 L 字元則稱 AL 字串,AL 不分大小寫。
    2. 例:A_PENCILA_XXBBHCL_ 表示空白字元)
    3. 使用腳本執行的預設第一個參數 $1 讀入一長字串。
    4. 消去所有可能的 AL 字串,使得消去後之輸出不包含 AL 字串。
    5. 範例輸入:This is a ball, not a bell.
      範例輸出:
      This is , not l.
  6. 寫一腳本 loop4.sh,要求如下:
    1. 使用腳本執行的預設第一個參數 $1 讀入一個目錄字串變數 dirname。
    2. 如果變數 dirname 不是目錄,輸出「NO $dirname directory」到 stderr、退出、回傳值 1。
    3. 建立一個 function txtrename,將預設變數 $1 檔名 *.txt 改名為 *.bak,例如:$1 是 abc.txt,則被改名為 abc.bak。
    4. 使用 for 迴圈讀取目錄 dirname 中所有的 .txt 檔,逐一呼叫 txtrename 函式改名為 .bak。