execv shell shell指令碼學習

2021-10-13 13:56:24 字數 2890 閱讀 5195

shell指令碼:資料批量處理,任務批量處理

shell指令碼檔案以.sh為字尾,其實際無意義。

shell執行原理:

1.命令中轉(建立子程序,分析執行,返回結果)

2.建立程序完成任務

3.父程序不受子程序錯誤影響

file /bin/bash,為二進位制檔案,shell的直譯器(不是shell指令碼)

bash與shell的關係:王婆與媒婆

在指令碼中第一行必須為:告知直譯器及版本,#!稱為shebang#!bin/bash

bash test.sh

test.sh被當作引數傳給可執行檔案即子bash,

執行過程如下圖:

執行方式有:

cd,export這類命令沒有建立子程序,當前環境直接執行,這種命令叫內建命令。即通過bash:二進位制內函式呼叫。

.表示1.當前路徑

2. . ./test.sh為在當前shell下執行指令碼檔案

不是內建命令會創子程序,execv程式替換

注:source和.的用處一樣

printenv和env可列印出當前shell的環境變數。

env:列印環境變數。

set:列印本地變數和環境變數,範圍更大

即例子如下

取消變數設定為unset:刪除已定義的環境變數或本地變數.

在定義變數時不需$,取變數值時要用$。shell變數不需要明確定義

類 型,事實上shell變數的值都是字串,例如我們定義var=45,其實var的值是字串45不是整數。 shell變數不需要先定義後使用,如果對乙個沒有定義的變數取值,則值為空字串。

如下例子:

即vblef無法顯示(未找到),需加{vbl}df;

也可以兩條命令msg=$(cat file | grep 'hello bit')

算術代換:$((val)+$(val1))

不加$,其中乙個加,兩個都加都可以執行整數加法。

重要概念:

1.$(與`的區別與聯絡

聯絡:二者都可用於命令替換作用一樣。

區別:對於命令替換來說, $(command)形式已經取代了後置引用`command`

(1) bash中的後置引用 `command`會將命令中的\\轉義為\再執行,而$(command)則不會進行轉義

eg:echo `echo '\\'`

輸出:echo $(echo '\\')

輸出(2) $(...)形式的命令替換是允許巢狀的

在多層次的復合替換中,反引號須要額外的跳脫( /` )處理,而 $( ) 則比較直觀。例如:`com1`com2`` 你這麼寫就是錯的。需要`com1/`com2/``如果有多個命令巢狀就比較複雜了。而用$()就比較直觀比如$(com1$(com2$(com3))) 不過,$( ) 並不是沒有劣勢的...反引號 基本上可用在全部的 unix shell 中使用,若寫成 shell script ,其移植性比較高。而 $() 並不見的每一種 shell 都能使用.

2.eval命令

eval命令將會首先掃瞄命令列進行所有的置換,然後再執行該命令。該命令適用於那些一次掃瞄無法實現其功能的變數。該命令對變數進行兩次掃瞄。這些需要進行兩次掃瞄的變數有時被稱為複雜變數。不過這些變數本身並不複雜。e v a l命令也可以用於回顯簡單變數,不一定是複雜變數。顯示簡單變數

顯示複雜變數

eg:新建hello.txt寫入hello world

從上面的結果可以看出,使用eval命令不但可以置換該變數,還能夠執行相應的命令。第一次掃瞄進行了變數置換,第二次掃瞄執行了該字串中所包含的命令cat hello.txt。

3.還可以用來顯示出傳遞給指令碼的最後乙個引數

(1)eval echo \$$# 取得最後乙個引數

如:cat last

eval echo \$$#

./last one two three four

four

第一遍掃瞄後,shell把反斜槓去掉了。當shell再次掃瞄該行時,它替換了$4的值,並執行echo命令

(2)$ cat test1

#!/bin/bash

echo "last argument os "$(eval echo \$$#)""

$ ./test1 value bank test last

last argument os last

在上面的指令碼中,eval命令首先把$ $ #解析為當前shell的引數個數,然後在第二次掃瞄時

得出最後乙個引數。

4.給每個值乙個變數名

可以給乙個值乙個變數名。假定有乙個名為test2的檔案:

你希望該檔案中的第一列成為變數名,第二列成為該變數的值,這樣就可以:

[neau@mail ~]$ cat test2

commany tq

langue english

like yes

[neau@mail ~]$ cat test3

#!/bin/bash

while read name value

doeval "$=$"

done

echo "$commany $langue $like"

[neau@mail ~]$ ./test3

tq english yes

5.以下示意如何用eval命令建立指向變數的「指標」:

3.crond定時任務

crond 是linux用來定期執行程式的命令。當安裝完成作業系統之後,預設便會啟動此任務排程命令。crond命令每分鐘會定期檢查是否有要執行的工作,如果有要執行的工作便會自動執行該工作。而linux任務排程的工作主要分為以下兩類:

1、系統執行的工作:系統週期性所要執行的工作,如備份系統資料、清理快取

2、個人執行的工作:某個使用者定期要做的工作,例如每隔10分鐘檢查郵件伺服器是否有新信,這些工作可由每個使用者自行設定

指令碼裡學數學 函式

二 函式返回值 三 函式傳參 四 函式變數作用範圍 五 函式庫 六 遞迴 將命令序列按格式寫在一起 可方便重複使用命令序列 function 函式名函式名 return表示退出函式並返回乙個退出值,指令碼中可以用 變數顯示該值 使用原則 1 函式一結束就取返回值,因為 變數只返回執行的最後一條命令的...

groovy 速學 03 指令碼

目錄 摘要 執行指令碼,繫結域 從命令列中執行指定指令碼 groovy example.groovy在其它程式中執行指定指令碼 有一指令碼檔案 example.groovy def s new example s.run 也可以通過該指令碼物件直接執行指令碼內的函式 通過 new 建立的指令碼物件可...

從指令碼學python 秋名山車神

最近做bugku的時候,做到秋名山車神那題,連python都不會 淚 很慚愧 指令碼 來自上面這個writeup import requests url s requests.session req s.get url a req.text req.text.find 5 req.text.find...