shell腳本中的
『壹』 shell腳本中的 exec 命令
   exec執行命令時,不會啟用新的shell進程。
     source和 .也不會啟用新的shell進程,在當前shell中執行,設定的局部變數在執行完命令後仍然有效。
     bash或sh執行時,會另起一個子shell進程,其繼承父shell進程的環境變數,其子shell進程的變數執行完後不影響父shell進程。
     exec是用被執行的命令行替換掉當前的shell進程,且exec命令後的其他命令將不再執行。
     例如在當前shell中執行 exec ls 表示執行ls這條命令來替換當前的shell ,即為執行完後會退出當前shell。
     為了避免父shell被退出,一般將exec命令放到一個子shell腳本中,在父sehll中調用這個子shell腳本,調用處可以用bash xx.sh(xx.sh為存放exec命令的腳本),這樣會為xx.sh建立一個子shell去執行,當執行exec後該子shell進程就被替換成相應的exec的命令。
   其中有一個例外:當exec命令對文件描述符操作的時候,就不會替換shell,而是操作完成後還會繼續執行後面的命令!
    文件描述符 
   shell中描述符一共有12個
   0 代表標准輸入
   1 代表標准輸出
   2 錯誤輸出
   其他 3-9 都是空白描述符
其含義是: 復制標准輸出到3 ,錯誤輸出到 4 ,把 3 4 保存在bash.log 這個文件中。
 其含義是:將bash.sh腳本執行的標准輸出和錯誤輸出追加重定向到 bash.log
   如果exec 跟的是其他命令,則其他命令結束後,本shell也隨之停止
可以看到隨著 echo " hello oracle" 這條指令運行完本 整個腳本執行完畢,後面的 echo " hello db2" 沒有執行!
二、linux shell 腳本中, $@ 和 $@ 分別是什麼意思?
$@ 表示所有腳本參數的內容
$# 表示返回所有腳本參數的個數
示例:編寫如下shell腳本,保存為test.sh
說明:給腳本提供了兩個參數,所以 @代表了參數的內容!
 怎麼理解shell腳本中  exec "`dirname "$0"`/node""$0" "$@" ? 
    $0              #腳本自己的路徑
    "`dirname "$0"`"/node        #腳本目錄下的node程序的路徑
    $@                #腳本被執行時的命令行參數
合起來就是:用腳本目錄下的node程序來解釋這個腳本本身
  exec scala "$0" "$@" 是什麼意思
   這是bash語法。
    $0           #表示當前腳本的名字
    $@           #表示當前腳本執行的所有參數
    exec scala "$0" "$@"      #表示用scala命令,帶參數,執行當前腳本
$0 是位置參數,表示腳本名稱
$1 表示腳本的第一個參數,依次類推直到 $9
exec用於執行命令、或腳本、或外部可執行程序,會新建一個shell去執行
綜上,這里exec sh "$0" 就是執行腳本本身
所以,就是一個循環過程,每隔兩秒列印一次 Hello
『貳』 shell 腳本里$什麼意思
Linux shell 腳本中, $@ 和$# 分別是:
$@:表示所有腳本參數的內容
$#:表示返回所有腳本參數的個數。
示例:編寫如下shell腳本,保存為test.sh
#!/bin/sh
echo "number:$#"
echo "argume:$@"
執行腳本:
./test.sh first_argsecond_arg

概念:
Shell就是一個命令行解釋器,它的作用就是遵循一定的語法將輸入的命令加以解釋並傳給系統。它為用戶提供了一個向Linux發送請求以便運行程序的介面系統級程序,用戶可以用Shell來啟動、掛起、停止甚至是編寫一些程序。 Shell本身是一個用C語言編寫的程序,它是用戶使用Linux的橋梁。
以上內容參考:網路-Shell腳本
『叄』 如何在shell腳本中使用變數
1、linux shell中的變數一般定義格式為:var=value。其中var是變數名稱,=是賦值,value是給變數賦的值。比如下面的變數定義。
a=12;
b="helloworld"
2、注意變數名稱的第一個字元不可以是數字,但是可以是下劃線。如下示例則為非法的變數名。
3、要使用變數的值,在變數前面加上$符號即可。比如下面的示例:
123=123//這是錯誤的變數名稱
_123=123//這是合法的。

『肆』 如何在shell腳本中使用變數
在shell腳本中變數的定義,只能以字母和下劃線開始,區分大小寫,可以包含數字、字母下劃線。
示例代碼,讀取用戶輸入到變數myvar,然後再輸入。
#!/bin/bash
echo "input myvar"
read myvar
echo "myvar is $myvar"
效果如下:

『伍』 Shell基本腳本命令使用教程
1、本地變數:用戶私有變數,只有本用戶可以訪問,保存在家目錄的 .bash_profile、.bashrc文件中
   2、全局變數:所有用戶都可以使用,保存在 /etc/profile 文件中
   3、用戶自定義變數:用戶自定義,比如腳本中的變數
   定義變數格式: 變數名=值 (=兩邊不能有空格)
   字元串用單引號或者雙引號引起來
  
 shell支持正則表達式的常見命令:grep、sed、awk。
  
 sed 是一個行(流)編輯器,非互動式的對文件內容進行增刪改查操作
  
 awk 能夠集過濾、提取、運算為一體,它的工作方式是讀取數據,將每一行數據視為一條記錄,每條記錄以欄位分隔符分成若干欄位,然後輸出各個欄位的值。平行命令還有 gawk、pgawk、dgawk。
『陸』 Shell腳本:${...}在字元串中的多種用法
1、${var}
  
 限定變數。
  
 如果一個變數名A是另一個變數名AB的前部分,那麼,如果要在AB相連時,要得到A的值,就必須使用${var}限定。
  
 如果變數名不會產生歧義時(即獨立的變數名),${var}與$var沒有任何區別。
  
 var="hello"
  
 var_01="hello01"
  
 echo  $var $var_01 ${var}_01
  
 >>> hello hello01 hello_01
  
 2、${#var}
  
 得到變數var的長度
  
 var="hello"
  
 echo ${#var}
  
 >>> 5
  
 3、${var#}
  
 刪除變數首部的字元(串),
  
 "#"後面的可以是字面串,也可以是正則表達式(惰性匹配)。
  
 var="hello"
  
 echo ${var#he}
  
 >>> llo
  
 var="/res_pos/path/from/something"
  
 echo ${var#/}
  
 >>> res_pos/path/from/something    # 刪除第一個"/"
  
 echo ${var#/*/}
  
 >>> path/from/something   # 刪除首部匹配"/*/"的串,即"/res_pos/"
  
 4、${var##}
  
 刪除變數首部的字元(串),
  
 只是,當使用2個"##"時,匹配是貪婪的(貪婪匹配,也就是盡可能多的匹配)。
  
 echo ${var##/*/}
  
 >>> something  # 刪除首部匹配"/*/"的串,即"/res_pos/path/from/"。
  
 5、${var%}
  
 刪除變數尾部的字元(串),
  
 "%"後面的可以是字面串,也可以是正則表達式(惰性匹配)。
  
 var="hello"
  
 echo ${var%llo}
  
 >>> he
  
 var="~/res_pos/path/from/something"
  
 echo ${var%/*}
  
 >>> ~/res_pos/path/from    # 刪除尾部的"/something"
  
 6、${var%%}
  
 刪除變數尾部的字元(串),
  
 只是,當使用2個"%%"時,匹配是貪婪的(對應於第4條)
  
 var="~/res_pos/path/from/something"
  
 echo ${var%/*}
  
 >>> ~    # 刪除第一個的"/"後的所有所有內容(包括"/"),貪婪匹配中,"/*"就是"/"後的所有字元串
  
 7、${var::}
  
 跟python的切片概念相似,取變數var的起始索引,
  
 指定長度的子串(${var:索引:長度})。
  
 var="~/res_pos/path/from/something"
  
 echo ${var:0:5}
  
 >>> ~/res
  
 echo ${var:1:5}
  
 >>> /res_      # 可見,字元串的索引是從0開始的
  
 echo ${var::5}
  
 >>> ~/res      # 省略"索引",默認為從0開始
  
 echo ${var:1:}
  
 >>>               # 省略"長度",默認長度為0,所以輸出為空
  
 8、${var//}
  
 字元串替換。
  
 將var中的字元串A替換成字元串B(${var/A/B})。
  
 var="hello world"
  
 echo ${var/hello/hi}
  
 >>> hi world      # 字元串"hello"替換成了"hi"
  
 echo ${var/l/X}
  
 >>> heXlo world  # 第一個"l"替換成了"X"
  
 9、${var///}
  
 字元串替換,
  
 與第8點相同,只不過,現在是將所有出現的串A替換成串B(${var//A/B})。
  
 var="hello world"
  
 echo ${var//l/X}
  
 >>> heXXo worXd  # 所有的"l"都替換成了"X"
  
 10、${var/#/}
  
 替換字元串首部的串A為串B,
  
 (${var/#A/B}),與第8點不同的是,這里只替換首部的串A。
  
 var="hello world. hello baby."
  
 echo ${var//h/H}
  
 >>> Hello world. Hello baby.    # 將所有"h"替換成了"H"
  
 echo ${var/#h/H}
  
 >>> Hello world. hello baby.    # 將首部的"h"替換成了"H"
  
 echo ${var/e/E}
  
 >>> hEllo world. hello baby.    # 將第一個出現的"e"替換成了"E"
  
 echo ${var/#e/E}
  
 >>> hello world. hello baby.    # 首字元不是"e",所以沒有進行任何替換,原樣輸出。
  
 11、${var/%/}
  
 替換字元串尾部的串A為串B,
  
 (${var/%A/B}),與第10點相似,只是這是處理的是字元串尾。
  
 var="hello hello"
  
 echo ${var/%o/END}
  
 >>> hello hellEND    # 將尾部的字元"o",替換成了"END"。
