標籤:shell 編程筆記
#! /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裡面的Regex:
定義:
簡而言之,Regex就是記錄文本規則的代碼。
Regex:元字元
\b 代表著單詞的開頭或是結尾
\d 代表著數字 例如0\d{2}-\d{8} 意思就是 010-12345678
grep 尋找文本
Regex中的元字元:
^ :行或者字串開始
$ :行或字串結束
. :匹配一個非分行符號的字元
* :匹配0個或多個先前字元 .* 代表任一字元
[...] :方括號運算式 [0-9]匹配單個數字 ^位於括號運算式的開頭表示相反的意思[^0-9]不是0-9之間的數字
\ :開啟或者關閉後續字元
Regex:基本Regex 和擴充Regex
\(\):
\n:
x\{m,n\}: 區間運算式 x出現的次數 最少m次 最多n次
+: 匹配前面Regex的一個或者多個執行個體
?: 匹配前面Regex的一個或者0個執行個體
():用括弧括起來的Regex
|: 匹配|前面或者後面的Regex
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
Regex裡面的反向引用:
\(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 編程筆記