<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 附錄 [TOC=2,3] ## Shell編程學習筆記 ## 前言 這是作者早期的 Shell 編程學習筆記,主要包括 Shell 概述、 Shell 變量、位置參數、特殊符號、別名、各種控制語句、函數等 Shell 編程知識。 要想系統地學 Shell,應該找些較系統的資料,例如:[《Shell 編程范例》](http://www.tinylab.org/shell-programming-paradigm-series-index-review/)和[《鳥哥學習Shell Scripts》](http://www.chinaunix.net/jh/24/628472.html)。 ## 執行 Shell 腳本的方式 #### 范例:輸入重定向到 Bash ~~~ $ bash < ex1 ~~~ 可以讀入 `ex1` 中的程序,并執行 #### 范例:以腳本名作為參數 其一般形式是: ~~~ $ bash 腳本名 [參數] ~~~ 例如: ~~~ $ bash ex2 /usr/meng /usr/zhang ~~~ 其執行過程與上一種方式一樣,但這種方式的好處是能在腳本名后面帶有參數,從而將參數值傳遞給程序中的命令,使一個 Shell 腳本可以處理多種情況,就如同函數調用時可根據具體問題傳遞相應的實參。 #### 范例:以 . 來執行 如果以當前 Shell (以 `·` 表示)執行一個 Shell 腳本,則可以使用如下簡便形式: ~~~ $ · ex3[參數] ~~~ #### 范例:直接執行 將 Shell 腳本的權限設置為可執行,然后在提示符下直接執行它。 具體辦法: ~~~ $ chmod a+x ex4 $ ./ex4 ~~~ 這個要求在 Shell 腳本的開頭指明執行該腳本的具體 Shell,例如 `/bin/bash`: ~~~ #!/bin/bash ~~~ ## Shell 的執行原理 Shell 接收用戶輸入的命令(腳本名),并進行分析。如果文件被標記為可執行,但不是被編譯過的程序,Shell 就認為它是一個 Shell 腳本。 Shell 將讀取其中的內容,并加以解釋執行。所以,從用戶的觀點看,執行 Shell 腳本的方式與執行一般的可執行文件的方式相似。 因此,用戶開發的 Shell 腳本可以駐留在命令搜索路徑的目錄之下(通常是 `/bin`、`/usr/bin`等),像普通命令一樣使用。這樣,也就開發出自己的新命令。如果打算反復使用編好的 Shell 腳本,那么采用這種方式就比較方便。 ## 變量賦值 可以將一個命令的執行結果賦值給變量。有兩種形式的命令替換:一種是使用倒引號引用命令,其一般形式是: `命令表`。 #### 范例:獲取當前的工作目錄并存放到變量中 例如:將當前工作目錄的全路徑名存放到變量dir中,輸入以下命令行: ~~~ $ dir=`pwd` ~~~ 另一種形式是:`$(命令表)`。上面的命令行也可以改寫為: ~~~ $ dir=$(pwd) ~~~ ## 數組 `Bash` 只提供一維數組,并且沒有限定數組的大小。類似與 C 語言,數組元素的下標由 0 開始編號。獲取數組中的元素要利用下標。下標可以是整數或算術表達式,其值應大于或等于 0 。用戶可以使用賦值語句對數組變量賦值。 #### 范例:對數組元素賦值 對數組元素賦值的一般形式是:`數組名[下標]=值`,例如: ~~~ $ city[0]=Beijing $ city[1]=Shanghai $ city[2]=Tianjin ~~~ 也可以用 `declare` 命令顯式聲明一個數組,一般形式是: ~~~ $ declare -a 數組名 ~~~ #### 范例:訪問某個數組元素 讀取數組元素值的一般格式是: `${數組名[下標]}`,例如: ~~~ $ echo ${city[0]} Beijing ~~~ #### 范例:數組組合賦值 一個數組的各個元素可以利用上述方式一個元素一個元素地賦值,也可以組合賦值。定義一個數組并為其賦初值的一般形式是: ~~~ 數組名=(值1 值2 ... 值n) ~~~ 其中,各個值之間以空格分開。例如: ~~~ $ A=(this is an example of shell script) $ echo ${A[0]} ${A[2]} ${A[3]} ${A[6]} this an example script $ echo ${A[8]} ~~~ 由于值表中初值共有 7 個,所以 `A` 的元素個數也是 7 。 `A[8]` 超出了已賦值的數組 `A` 的范圍,就認為它是一個新元素,由于預先沒有賦值,所以它的值是空串。 若沒有給出數組元素的下標,則數組名表示下標為 0 的數組元素,如 `city` 就等價于 `city[0]`。 #### 范例:列出數組中所有內容 使用 `*` 或 `@` 做下標,則會以數組中所有元素取代。 ~~~ $ echo ${A[*]} this is an example of shell script ~~~ #### 范例:獲取數組元素個數 ~~~ $ echo ${#A[*]} 7 ~~~ ## 參數傳遞 假如要編寫一個 Shell 來求兩個數的和,可以怎么實現呢?為了介紹參數傳遞的用法,編寫這樣一個腳本: ~~~ $ cat > add let sum=$1+$2 echo $sum ~~~ 保存后,執行一下: ~~~ $ chmod a+x ./add $ ./add 5 10 15 ~~~ 可以看出 5 和 10 分別傳給了 `$1` 和 `$2`,這是 Shell 自己預設的參數順序,其實也可以先定義好變量,然后傳遞進去。 例如,修改上述腳本得到: ~~~ let sum=$X+$Y echo $sum ~~~ 再次執行: ~~~ $ X=5 Y=10 ./add 15 ~~~ 可以發現,同樣可以得到正確結果。 ## 設置環境變量 export一個環境變量: ~~~ $ export opid=True ~~~ 這樣子就可以,如果要登陸后都生效,可以直接添加到 `/etc/profile` 或者 `~/.bashrc` 里頭。 ## 鍵盤讀起變量值 可以通過 `read` 來讀取變量值,例如,來等待用戶輸入一個值并且顯示出來: ~~~ $ read -p "請輸入一個值 : " input ; echo "你輸入了一個值為 :" $input 請輸入一個值 : 21500 你輸入了一個值為 : 21500 ~~~ ## 設置變量的只讀屬性 有些重要的 Shell 變量,賦值后不應該修改,那么可設置它為 `readonly` : ~~~ $ oracle_home=/usr/oracle7/bin $ readonly oracle_home ~~~ ## 條件測試命令 test 語法:`test 表達式`如果表達式為真,則返回真,否則,返回假。 #### 范例:數值比較 先給出數值比較時常見的比較符: > `-eg =;-ne !=;-gt >;-ge >=;-lt <;-le <=` ~~~ $ test var1 -gt var2 ~~~ #### 范例:測試文件屬性 文件的可讀、可寫、可執行,是否為普通文件,是否為目錄分別對應: > `-r; -w; -x; -f; -d` ~~~ $ test -r filename ~~~ #### 范例:字符傳屬性以及比較 > 串的長度為零:`-z`; 非零:`-n`,如: ~~~ $ test -z s1 ~~~ 如果串 `s1` 長度為零,返回真。 #### 范例:串比較 > 相等`"s1"="s2"`; 不相等 `"s1"!="s2"` 還有一種比較串的方法(可以按字典序來比較): ~~~ $ if [[ 'abcde' < 'abcdf' ]]; then echo "yeah,果然是誒"; fi yeah,果然是誒 ~~~ ## 整數算術或關系運算 expr 可用該命令進行的運算有: > 算術運算:`+ - * / %`;邏輯運算`:= ! < <= > >=` 如: ~~~ $ i=5;expr $i+5 ~~~ 另外,`bc` 是一個命令行計算器,可以進行一些算術計算。 ## 控制執行流程命令 #### 范例:條件分支命令 if `if` 命令舉例:如果第一個參數是一個普通文件名,那么分頁打印該文件;否則,如果它為目錄名,則進入該目錄并打印該目錄下的所有文件,如果也不是目錄,那么提示相關信息。 ~~~ if test -f $1 then pr $1>/dev/lp0 elif test-d $1 then (cd $1;pr *>/dev/lp0) else echo $1 is neither a file nor a directory fi ~~~ #### 范例:case 命令舉例 `case` 命令是一個基于模式匹配的多路分支命令,下面將根據用戶鍵盤輸入情況決定下一步將執行那一組命令。 ~~~ while [ $reply!="y" ] && [ $reply!="Y" ] #下面將學習的循環語句 do echo "\nAre you want to continue?(Y/N)\c" read reply #讀取鍵盤 case $replay in (y|Y) break;; #退出循環 (n|N) echo "\n\nTerminating\n" exit 0;; *) echo "\n\nPlease answer y or n" continue; #直接返回內層循環開始出繼續 esac done ~~~ #### 范例:循環語句 while, until 語法: ~~~ while/until 命令表1 do 命令表2 done ~~~ 區別是,前者執行命令表 1 后,如果退出狀態為零,那么執行 `do` 后面的命令表 2,然后回到起始處,而后者執行命令表 1 后,如果退出狀態非零,才執行類似操作。例子同上。 #### 范例:有限循環命令 for 語法: ~~~ for 變量名 in 字符串表 do 命令表 done ~~~ 舉例: ~~~ FILE="test1.c myfile1.f pccn.h" for i in $FILE do cd ./tmp cp $i $i.old echo "$i copied" done ~~~ ## 函數 現在來看看 Shell 里頭的函數用法,先看個例子:寫一個函數,然后調用它顯示 `Hello, World!` ~~~ $ cat > show # 函數定義 function show { echo $1$2; } H="Hello," W="World!" # 調用函數,并傳給兩個參數H和W show $H $W ~~~ 演示: ~~~ $ chmod 770 show $./show Hello,World! ~~~ 看出什么蹊蹺了嗎? ~~~ $ show $H $W ~~~ 咱們可以直接在函數名后面跟實參。 實參順序對應“虛參”的 `$1,$2,$3`…… 注意:假如要傳入一個參數,如果這個參數中間帶空格,怎么辦? 先試試看。 來顯示 `Hello World` (兩個單詞之間有個空格) ~~~ function show { echo $1 } HW="Hello World" show "$HW" ~~~ 如果直接 `show $HW`,肯定不行,因為 `$1` 只接受到了 `Hello`,所以結果只顯示 `Hello`,原因是字符串變量必須用 `"` 包含起來。 ## 后記 感興趣的話繼續學習吧! 還有好多強大的東西等著呢,比如 `cut`,`expr`,`sed`,`awk` 等等。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看