Shell指令碼學習指南讀書筆記(一)
第1章 背景知識略
第2章 入門
編譯型語言 優點:高效 缺點:多半運作於底層,處理位元組、整數或其他機器層級的物件(C++中就很難將一個目錄所有檔案複製到另一個目錄中) 指令碼程式語言 通常是解釋型的,這類程式是直譯器讀入程式程式碼,轉換成內部形式再執行(直譯器本身是一般的編譯型程式)
為啥使用Shell指令碼? 好處:執行在比編譯型語言還高的層級,能夠輕易處理檔案與目錄之類的物件 缺點:效率不如編譯型語言
命令
who 用途:現在系統中有誰在登入
[[email protected] ~]$ who liujing :0 2018-10-18 11:17 (:0) liujing pts/0 2018-10-18 11:17 (:0)
wc 用途:數字計算,算出 行數line、字數word、字元數character | (一個豎線,管道符號) 用途:在兩個程式之間建立管道pipeline
[[email protected] ~]$ who | wc -l
2
who的輸出,成了wc的輸入,wc所列出的結果就是已登入使用者的個數
將命令轉在一個獨立的命令
[l[email protected] ~]$ cat > nusers
who | wc -l
CTRL+D 表示 end-of-file
[[email protected] ~]$ chmod +x nusers
[[email protected] ~]$ ./nusers
2
小型Shell指令碼開發週期:
- 直接單獨測試每個命令列
- 將它們一起放在一個獨立的腳本里
- 將這個獨立的指令碼設定執行許可權
- 在使用時可直接執行該獨立指令碼
Shell執行一個程式時:
- 要求Unix核心啟動一個新的程序以便在該程序裡執行指定的程式,核心知道如何為編譯型程式做這件事
- Shell指令碼不是編譯型程式,當Shell要求核心執行它時則無法做到(錯誤資訊:not executable format file 不是可執行的格式檔案)
- Shell收到錯誤資訊會啟動一個新的/bin/sh(標準Shell)副本來執行該程式
#! 告知UNIX核心應該以哪個Shell來執行所指定的Shell指令碼
#! /bin/sh
該行長度最好不要超過64個字元
#! /bin/sh -
- 表示沒有Shell選項,這是基於安全考慮,可避免某種程度的欺騙式攻擊 spoofing attack
重定向 < >
- - 表示選項結尾(PS:這不是很理解) ; 分隔同一行多條命令 & 在後臺執行命令,意味著不用等命令完成,就可以執行下條命令
三種基本命令
- 內建命令
- Shell函式
- 外部命令
Shell 變數名稱 開頭是一個字母或下劃線 變數賦值,中間沒有任何空格 要賦值的值包含空格,要加引號 取出變數值用$
name1=liujing name2=$name1 name3=" $name1 $name2"
輸出 echo 會自動加換行符 printf 不會自動加換行符
重定向 < 改變標準輸入 > 改變標準輸出 >> 以附加的形式加到檔案結尾 | 將左邊的標準輸出變為右邊的標準輸入
tr
/dev/null 傳送到此檔案的資料都會被系統丟掉 /dev/tty 自動重定向到一個終端
stty -echo 關閉自動列印輸入字元的功能
stty echo 開啟自動列印輸入字元的功能
stty(set tty)
$PATH : 分隔
echo $PATH
.profile ::
引數 $1 ~ $9 超過9則使用{ }包起來,如 ${10}
[[email protected] ~]$ who
liujing :0 2018-10-18 11:17 (:0)
liujing pts/0 2018-10-18 11:17 (:0)
[[email protected] ~]$ who | grep liujing
liujing :0 2018-10-18 11:17 (:0)
liujing pts/0 2018-10-18 11:17 (:0)
[[email protected] ~]$ who | grep pts
liujing pts/0 2018-10-18 11:17 (:0)
# 為註釋 #! 也同樣扮演註釋的角色
開啟及關閉命令追蹤
set -x
set +x