標籤:一模一樣 變數 支援 bre 第一個 定義 source 使用 儲存
#! /bin/sh
尋找shell解譯器 /bin/sh 是一個路徑
#! /usr/bin/python
僅僅是尋找一個python的解譯器
執行linux程式的方法:
使得檔案具有可執行檔許可權 直接執行
調用解譯器來運行
使用source來運行
shell 存在著內部命令 和外部命令 內建命令就是shell 程式本身的命令
運行內部命令的時候 不包含進程的建立和消亡
可是在運行外部命令的時候,存在著進程是建立和消亡。以此同一時候
外部命令啟動並執行步驟例如以下:、
建立一個子進程
尋找路徑
子進程運行 父進程休眠
子進程運行完成。父進程從終端讀取下一條命令
source 命令的運行不會 建立進程 更加的不會有進程的消亡 沒有子進程
僅僅有在父進程中運行。
比如:echo.sh
#! /bin/sh
cd /tmp
echo "hello world"
運行方法選擇的是 賦予許可權的方式的話 ./echo.sh 此時父進程接受命令 發現不是內建命令 就會建立一個子進程(和父進程一模一樣)來運行這個外部命令 此時子進程 來設定自己的環境變數 cd 命令改變的僅僅是子進程的檔案夾 並沒有改變父進程的檔案夾 。子進程運行完畢 消亡,父進程等待下個命令運行 所以此方式下的運行 cd命令會失效。
所以選擇的運行方式 是source的形式 就會運行 source不會建立子進程 僅僅是在父進程中進行。
shell變數:
全域變數 環境變數 自己定義變數
局部變數 必須使用local聲明 否則還是全域可見的
export 用於設定當前的環境變數
電腦 不能直接理解進階語言 須要將進階語言 翻譯成機器語言 電腦才幹看的明確 翻譯是方式有兩種 一種是:編譯 一種是:解釋
編譯型的語言 是在程式運行之前 須要一個專門的編譯過程 ,僅僅做一次的編譯,啟動並執行時候不須要進行編譯了 運行效率較高
解釋型的語言 是在程式在啟動並執行時候 運行一次 翻譯一次 效率較低。
指令碼參數的傳遞
參數的傳遞 能夠將外部的值傳遞到指令碼的內建函式中去,提高指令碼的靈活性。
testfunc()
echo "$# parameters";
echo "[email protected]";
testfunc a b c
3 parameters
a b c
testfunc a "b c"
2 parameters
a b c
shell中的變數是不區分類型的 都是字串類型 shell變數中有3中:使用者變數 位置變數 環境變數
linux中shell變數$#,[email protected],$0,$1,$2的含義解釋:
變數說明:
$$
Shell本身的PID(ProcessID)
$!
Shell最後執行的後台Process的PID
$?
最後執行的命令的結束代碼(傳回值) 有數值的情況下返回數值 成功返回0值 退出的狀態0 表示正常退出 非0表示執行出現異常
$-
使用Set命令設定的Flag一覽
$*
全部參數列表。如"$*"用「"」括起來的情況、以"$1 $2 … $n"的形式輸出全部參數。
[email protected]
全部參數列表。
如"[email protected]"用「"」括起來的情況、以"$1" "$2" … "$n" 的形式輸出全部參數。
$#
加入到Shell的參數個數
$0
Shell本身的檔案名稱
$1~$n
加入到Shell的各參數值。$1是第1參數、$2是第2參數…。
開機檔案:
/bin/login 讀取/etc/passwd檔案成功登入後,啟動一個互動的shell
/etc/environment 環境變數
假設須要對shell做全域性的設定 而且在每次的啟動的時候 自己主動載入 能夠將命令寫入開機檔案裡去
type用於顯示 命令是什麼類型的 是外部命令 內建命令 別名...
shell 的函數
#! /bin/sh
# 數字相加
function add(){
let "sum=$1+$2"
return $sum
}
運行:
source add.sh 將函數從檔案裡讀入 之後能夠直接調用
add 3 7
echo $?
$? 儲存是上一次的命令啟動並執行傳回值
7
shell的條件控制與流程
if condition
then
statements
elif contition
then
statements
else
statements
fi
shell裡面的case語句
case $1 in
-f) statements;;
-d) statements;;
esac
for 迴圈語句
for name [in list]
do
....
done
for file in `find . -iname "*.mp3"` //反單引號的作用就是將命令返回的結果作為字串
do
mpg123 $file
done
無限迴圈
path=$PATH
while true
do
if [-z $path]
then
break;
fi
ls -ld ${path%%:*}//列出path中第一個檔案夾
path=${path#*:}//截取path中的第一個檔案夾和冒號
done
Tips:
位置參數能夠用shift命令左移。比方shift 3表示原來的$4如今變成$1。原來的$5如今變成$2等等,原來的$1、$2、$3丟棄,$0不移動。
不帶參數的shift命令相當於shift 1。
很實用的 Unix 命令:shift。
我們知道。對於位置變數或命令列參數,其個數必須是確定的。
或者當 Shell 程式不知道其個數時,能夠把全部參數一起賦值給變數$*。
若使用者要求 Shell 在不知道位置變數個數的情況下,還能逐個的把參數一一處理,
也就是在 $1 後為 $2,在 $2 後面為 $3 等。在 shift 命令運行前變數 $1 的值在 shift 命令運行後就不可用了。
linux shell裡面的正則表達式:
定義:
簡而言之,正則表達式就是記錄文本規則的代碼。
正則表達式:元字元
\b 代表著單詞的開頭或是結尾
\d 代表著數字 比如0\d{2}-\d{8} 意思就是 010-12345678
grep 尋找文本
正則表達式中的元字元:
^ :行或者字串開始
$ :行或字串結束
. :匹配一個非分行符號的字元
* :匹配0個或多個先前字元 .* 代表隨意字元
[...] :方括號運算式 [0-9]匹配單個數字 ^位於括號運算式的開頭表示相反的意思[^0-9]不是0-9之間的數字
\ :開啟或者關閉興許字元
正則表達式:基本正則表達式 和擴充正則表達式
\(\):
\n:
x\{m,n\}: 區間運算式 x出現的次數 最少m次 最多n次
+: 匹配前面正則表達式的一個或者多個執行個體
?
: 匹配前面正則表達式的一個或者0個執行個體
():用括弧括起來的正則表達式
|: 匹配|前面或者後面的正則表達式
grep支援的元字元
\<: 單詞的開始
/>: 單詞的結束
\w: 匹配文字或是數字 [:alnum:]
\W: 匹配非文字或是數字 [[:alnum:]_]
\b: 單詞的鎖定符
字元集:
[:alnum:]: 文字數字字元集 A-Za-z0-9
[:alpha:]: 文字字元集
[:blank:]: 空格或者定位字元
[:digit:]: 數字字元
[:graph:]: 非Null 字元
[:lower:]: 小寫字元
[:cntrl:]: 控制字元
[:print:]: 非Null 字元
[:punct:]: 標點符號
[:space:]: 空白字元
[:upper:]: 大寫字元
[:xdigit:]: 十六進位數字 0-9 a-f A-F
正則表達式裡面的反向引用:
\(ab\)\(cd\)[efg]*\1\2 用來匹配: abcdabcd abcdeabcd abcdfabcd abcdgabcd \1: ab \2: cd
\(go\).*\1 用來匹配一行出現了2個go
交替 | you|me 用來匹配 you 或者 me 交替的優先順序是最低的
分組() (go)+ 匹配了一個go 或者是多個go
羅馬數字:
I=1
V=5
X=10
L=50
C=100 CD=400 DC=600
D=500
M=1000 MCM=1900
shell 編程筆記