2026年9月14日 星期一

Shell(.sh)


1. 在終端機螢幕上顯示文字、變數內容,或將訊息輸出到檔案中

    echo "Hello World"

2. 定義變數

    <variable name>=<data>

規則:

    a. 等號前後,不能有空格

    b. 變數名稱只能是英文和數字,且數字不能在開頭 

    c. 變數內容,如需空白,可放在雙引號 "" 或是單引號 '' 裡面

        -雙引號中若有特殊字元,例如 $,會保有原本的特性

        -單引號中所有的字元即為一般字元,沒有任何功能 。

    d. 反斜線 \, 可以跳脫其後接的第一個字元本身的功能  

3.  取得變數內容

    $<variable name>
    ${<variable name>}

4. 指令內容,可以使用 $(command) 或是 `command` 取得其他指令的值。

    username=$(whoami)
    echo $username
    user 

5. 取消變數設定

    unset username

6. 取得所有環境變數

    env

7.  自訂變數轉成環境變數

    export <variable name> 

8.  查看目前開放哪些環境變數

    export

9.  列出所有的變數:自訂變數,環境變數,bash 本身變數

    set

10. 語系相關

    a. 查看目前語系變數:locale

    b. 查看支援哪些語系:locale -a 

    c. 暫時修改語系的變數:export LANG=zh_TW.utf8

        只要有設定 LANG 或是 LC_ALL,則其他的變數就會被這兩個變數自動取代。

    d. 永久修改語系的變數:打開 /etc/locale.conf, 加入或更改:LANG="en_US.utf-8"

11.  讀取鍵盤輸入,當作變數值

    read <option> <variable name>

    option :
        -a : array,變數為陣列格式,以空白隔開,依序存入陣列中,索引從0開始。
        -p : prompt,跳出提示字串。
        -t : timeout,設定秒數內沒有完成則結束。 

12. 宣告變數的類型,沒指定,預設為字串。只有整數才可運算。 

    declare <option> <variable name>

    option :
        -a : 變數為陣列格式,以空白隔開,依序存入陣列中,索引從0開始。
        -i : 整數類型,可以進行數值運算,但是預設只能做到整數型態。
        -l : 將變數內容轉換為小寫。
        -r : 變數僅為 readonly,不可被更改也不可以被 unset。
        -u : 將變數內容轉換為大寫。
        -x : 開放變數轉換成環境變數,等同使用 export。

 

13. 比較符號:

    字串比較符號:
        =:等於(字串相等)
        !=:不等於(字串不相等)
        <:小於(按字典序比較)
        >:大於(按字典序比較)
        -z:檢查字串是否為空(長度為零)
        -n:檢查字串是否非空(長度大於零)

    數字比較符

        -eq:等於(數字相等)
        -ne:不等於(數字不相等)
        -lt:小於(數字小於)
        -le:小於或等於(數字小於或等於)
        -gt:大於(數字大於)
        -ge:大於或等於(數字大於或等於)

14. 檔案測試符號: 

    -e FILE:如果 FILE 存在,則為真。
    -f FILE:如果 FILE 存在且為一個檔案,則為真。
    -d FILE:如果 FILE 存在且為一個目錄,則為真。
    -s FILE:如果 FILE 存在且檔案大小不為零,則為真。
    -r FILE:如果 FILE 存在且可讀取(有讀取權限),則為真。
    -w FILE:如果 FILE 存在且可寫入(有寫入權限),則為真。
    -x FILE:如果 FILE 存在且可執行(有執行權限),則為真。
    -L FILE:如果 FILE 存在且為一個符號連結(軟連結),則為真。
    -p FILE:如果 FILE 存在且為一個命名管道(FIFO),則為真。
    -c FILE:如果 FILE 存在且為一個字元特殊文件,則為真。 

15. 流程控制:

    a. if, then else fi 

        if 條件
        then
            # 如果條件為True,執行這裡的命令
        else
            # 如果條件為False,執行這裡的命令
        fi

    b. if … elif … fi

        if 條件1
        then
            # 如果條件1為真,執行這裡的命令
        elif 條件2
        then
            # 如果條件2為真,執行這裡的命令
        else
            # 如果以上所有條件都不滿足,執行這裡的命令
        fi

    c.  case

        case 值 in
            條件1)
                    條件1匹配時執行的命令

                    ;;
            條件2)
                    條件2匹配時執行的命令

                    ;; 
            *)

                    沒有任何匹配時執行的命令

                    ;;
        esac

    d. for

        for 變數 in 列表; do
            執行的命令
        done

    e. while

        while 條件
            do
                # 當條件為真時執行的程式碼
        done

16. 函式(Function)結構: 

    function 函式名稱 {
        # 函式的程式碼
        # 可以使用傳遞給函式的參數
        # 函式的操作
        # ...
        # 返回值(可選)
    }

 

17. 結果輸出導向: 

    a. >(複寫導向

        echo "Hello" > output.txt

    b. >>(附加導向將指令的標準輸出以附加(Append)的方式存入檔案。它不會刪除舊資料,而是將新資料寫在檔案的最末端。

        echo "Hello" >> output.txt

    c. &>(全輸出導向):標準輸出(stdout)和標準錯誤輸出(stderr)「同時」存入同一個檔案中。無論指令執行成功還是發生錯誤,所有的訊息都會被寫進檔案(並採覆寫模式)。&> 與較傳統的寫法 > 檔案名稱 2>&1 效果完全相同。)

        echo "Hello" &> output.txt

    d. 2>&1 將標準錯誤輸出(stderr,代號 2)重新導向至標準輸出(stdout,代號 1)

        在 Linux 與 Bash 中,每個執行中的程式都有預設的資料流代號: 

            0:標準輸入(stdin,鍵盤輸入)

            1:標準輸出(stdout,正常顯示的訊息)

            2:標準錯誤(stderr,錯誤或警告訊息) 

 

18. 管線命令 (pipe):管線命令使用『 | 』,上一個指令輸出,給下一個指令使用。
    例:ls -al /etc | less
    ls 指令輸出後的內容,給 less 讀取

  

  

19. Shell Script基本結構元素:

    1. Shebang行:通常以#! 開頭後面接著一個解釋器(interpreter)的路徑,用來告訴系統使用哪種shell來執行script,系統會自動使用指定的解釋器執行script。

        #!/bin/bash

    2. 註釋:使用 # 符號來添加註釋。註釋不會被執行僅供備註閱讀。

        # 這是一個註釋

    3. 變數

        variable="Hello World!"

    4. 特殊變數

        $0, ${BASH_SOURCE[0]}:這個變數代表目前shellscript程式的檔案名稱(包括路徑)。

         $1, $2, ... $n:用於獲取命令行參數傳遞給程式的值。$1代表第一個參數,$2代表第二個參數,依此類推,$n代表第n個參數。

    5.  特殊的環境變數

        $HOME:代表當前的主目錄路徑,通常用於訪問家目錄。
        $USER:代表當前使用者名。
        $PWD:代表當前工作目錄的路徑。
        $SHELL:代表當前所使用的Shell的路徑。
        $PATH:包含了Shell用於查詢可執行命令的目錄列表。

    6. 指令:

        echo "This is a shell script."

    7. 流程控制:(如 if、else、case)和迴圈(如 for、while)來執行流程控制
        if [ $age -ge 18 ]; then
            echo "You are an adult."
        else
            echo "You are not yet an adult."
        fi

    8. 函數:函數能夠接受參數與返回值。

        function afunc {
            echo "Hello, $1!"
        }
        afunc "Alice"

 

 參考網站:

    Shell 的變數設定 

    Shell Script 基礎介紹 

 

 

沒有留言:

張貼留言