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"。