當前位置:首頁 » 編程軟體 » shell腳本中的

shell腳本中的

發布時間: 2023-11-14 08:19:19

『壹』 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"。

熱點內容
hp存儲擴容 發布:2024-11-17 23:29:16 瀏覽:567
在ftp中put表示什麼 發布:2024-11-17 23:29:12 瀏覽:381
mvc多文件上傳 發布:2024-11-17 23:13:56 瀏覽:153
玩游戲硬碟緩存32m 發布:2024-11-17 23:03:42 瀏覽:523
藍光存儲系統 發布:2024-11-17 23:03:41 瀏覽:434
地平線4提示配置低於最低怎麼辦 發布:2024-11-17 22:54:38 瀏覽:608
注冊銀行卡賬戶密碼填什麼 發布:2024-11-17 22:54:35 瀏覽:535
java壓縮上傳圖片 發布:2024-11-17 22:26:59 瀏覽:626
plc編程課件 發布:2024-11-17 22:18:23 瀏覽:468
我的世界伺服器信號一直在檢測 發布:2024-11-17 22:09:52 瀏覽:547