1. 程式人生 > >Shell指令碼學習指南讀書筆記(一)

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指令碼開發週期:

  1. 直接單獨測試每個命令列
  2. 將它們一起放在一個獨立的腳本里
  3. 將這個獨立的指令碼設定執行許可權
  4. 在使用時可直接執行該獨立指令碼

Shell執行一個程式時:

  1. 要求Unix核心啟動一個新的程序以便在該程序裡執行指定的程式,核心知道如何為編譯型程式做這件事
  2. Shell指令碼不是編譯型程式,當Shell要求核心執行它時則無法做到(錯誤資訊:not executable format file 不是可執行的格式檔案)
  3. Shell收到錯誤資訊會啟動一個新的/bin/sh(標準Shell)副本來執行該程式

#! 告知UNIX核心應該以哪個Shell來執行所指定的Shell指令碼

#! /bin/sh

該行長度最好不要超過64個字元

#! /bin/sh -

- 表示沒有Shell選項,這是基於安全考慮,可避免某種程度的欺騙式攻擊 spoofing attack

重定向 < >

- - 表示選項結尾(PS:這不是很理解) ; 分隔同一行多條命令 & 在後臺執行命令,意味著不用等命令完成,就可以執行下條命令

三種基本命令

  1. 內建命令
  2. Shell函式
  3. 外部命令

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