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...