Slide 1

Slide 1 text

Introduce to Linux Command Line Wen Liao

Slide 2

Slide 2 text

Outlines  Backgrounds  Command Lines  Shell Scripts  Regular Expression

Slide 3

Slide 3 text

 非常淺略介紹 Command line 和 Shell script  詳細細節請要回去看書

Slide 4

Slide 4 text

Test/Study Environments  Ubuntu 12.04.3 LTS  bash, version 4.2.25(1)

Slide 5

Slide 5 text

參考資料  2013 8 月份 SA@Tainan 從 shell 開始 8/10 教材  https://sites.google.com/a/study-area.org/sa- activity/home/2013-08-tn  鳥哥的 Linux 私房菜  http://linux.vbird.org/  man bash

Slide 6

Slide 6 text

Shell ( 理論上的定義) OS Kernel Shell   (CLI) Command Line Interface (GUI) Graphics User Interface

Slide 7

Slide 7 text

Shell ( 實際上的情況一) OS Kernel Shell (GUI)   CLI

Slide 8

Slide 8 text

Shell ( 實際上的情況二) OS Kernel Shell (CLI)   GUI CLI

Slide 9

Slide 9 text

本次 Shell 指的  Kernel 和應用程式的介面  CLI  理解並且讓 OS 執行從檔案輸入的 Command  Unix 所有東西都是檔案,包含鍵盤、滑鼠、螢幕

Slide 10

Slide 10 text

Outlines  Backgrounds  Command Lines  Shell Scripts  Regular Expression

Slide 11

Slide 11 text

wen:/tmp/$ echo -n test1 test2 test1 test2wen:/tmp/$ 第一提示符號 (PS1) Command Option 或 Parameter Argument: 要處理的對象 Command line 的組成

Slide 12

Slide 12 text

wen:/tmp/$ echo " > test1 > test2 > " test1 test2 第一提示符號 (PS1) Command Argument: 要處理的對象 Argument: 要處理的對象 Option 或 Parameter 可以是空的 第二提示符號 (PS2) Command line 的組成

Slide 13

Slide 13 text

-- :後面的都是 Argument $ touch -- -al $ ls -al -- -al -rw-rw-r-- 1 test test 0 Sep 12 15:31 -al $ rm -al rm: invalid option -- 'a' Try `rm ./-al' to remove the file `-al'. Try `rm --help' for more information. $ rm -- -al

Slide 14

Slide 14 text

IFS: Internal Field Separator  切割 token 的辨別字元,預設為空白,跳行和  ls -al /tmp 可以切割成 3 個 token  ls  -al  /tmp

Slide 15

Slide 15 text

$ $ command command fork() + exec() exit() 或是 kill Foreground mode Command 可以取得鍵盤 輸入的資料 Shell 須要等 command 結束才能執行下一個 command

Slide 16

Slide 16 text

$ $ command & command fork() + exec() Background mode 鍵盤輸入的資料傳給 shell 而不是 command Shell 不須等 command 結束就能執行下一個 command

Slide 17

Slide 17 text

撒尿牛丸 (1) Shell 鍵盤傳送 Process 對象 Command Shell 執行 command CTRL + Z 暫停 Command

Slide 18

Slide 18 text

撒尿牛丸 (2) Shell 鍵盤傳送 Process 對象 Command Shell 執行 command & CTRL + Z 暫停 Command Shell 執行 fg 把 command 轉回 foreground

Slide 19

Slide 19 text

Command 遺言  正常結束  0  有錯誤  非 0  用 $? 取得 $ ls test test $ echo $? 0 $ ls --bad ls: unrecognized option '--bad' Try `ls --help' for more information. $ echo $? 2

Slide 20

Slide 20 text

Command line 特殊字元  Meta-character  >  <  ;  ...  控制字元  |  ||  ...

Slide 21

Slide 21 text

Quote  Quote  把書上或是別人說的話一字不漏地原封抄下  也就是引用  Command line 中指的就是要 Shell 把 Meta- character 和控制字元當作一般文字處理

Slide 22

Slide 22 text

Quote  Hard Quoting: 成對的 ' ,第一個 ' 右邊所有的 特殊字元都會視為一般字元直到第二個 ' 出現  Soft Quoting: 成對的 " ,第一個 " 右邊大部份 的特殊字元都會視為一般字元直到第二個 " 出 現  例外仍然有特殊意義的字元  $ ` \ ! ( 有 enable history 功能 )  跳脫字元 \

Slide 23

Slide 23 text

一行執行多個 commands (1)  List  條件式  &&  ||  無條件式  ;

Slide 24

Slide 24 text

一行執行多個 commands (2)  (List)  會 fork sub-shell 去跑 list 內的命令  { List; }  第一個 { 後面要有一個空白,不會 fork

Slide 25

Slide 25 text

Pipe: 把前面的輸出轉給後面處理 屠宰 烹煮 $ 屠宰 豬隻 | 烹煮 梅干扣肉 我是梅干扣肉 Image: http://www.wikipedia.org/

Slide 26

Slide 26 text

範例  find | grep lib.*\\.a$  找出目錄下面所有 lib 開頭 .a 結尾的檔案 find grep 列出出目錄下面所有檔案 從前面輸出過濾出要找的字串

Slide 27

Slide 27 text

File Descriptor  簡稱 fd  Linux command 開檔案都會有對應的數字代號  /proc/[process id]/fd  關鍵字 :Process, process ID, file descriptor  每個 command 初始都會有 3 個開啟的檔案  0: stdin  1: stdout  2: stderr

Slide 28

Slide 28 text

Redirect  輸出 Redirect  Fd> 檔案  預設 1>  ls > file  ls -no_such_option 2> error_file  複製輸出 fd  Fd1>&Fd2  make 2>&1 | tee build.log

Slide 29

Slide 29 text

Redirect  輸入 Redirect  Fd< 檔案  預設 0<  cat < /tmp/test

Slide 30

Slide 30 text

執行 command 方法一 $ $ command command fork() + exec() exit() 或是 kill Command 不會影響到 shell 的內建變數

Slide 31

Slide 31 text

執行 command 方法二 $ $ exec command Exec 取代 shell 的記憶體空間。 Command 結束後終端機就會結束

Slide 32

Slide 32 text

執行 command 方法三 $ $ source command Command 只限 shell script Command 內的變數會影響 Shell 的變數

Slide 33

Slide 33 text

Shortcuts  CTRL + R: 搜尋打過的指令  CTRL + A: 切到 command 第一個字元  CTRL + E: 切到 command 最後一個字元  CTRL + Z: 暫停目前 command  CTRL + S: 停止螢幕捲動  CTRL + Q: 恢復螢幕捲動

Slide 34

Slide 34 text

X 下面的關於 Copy/Paste  滑鼠左鍵  連點兩下:選一個字  連點三下:選一行  滑鼠中鍵  貼上滑鼠點選的字

Slide 35

Slide 35 text

Gnome-terminal shortcuts  CTRL+SHIFT+C: COPY  CTRL+SHIFT+V: PASTE  CTRL+SHIFT+T: New TAB  SHIFT+INS: PASTE 滑鼠選的字  CTRL+SHIFT+F: 搜尋

Slide 36

Slide 36 text

Outlines  Backgrounds  Command Lines  Shell Scripts  Regular Expression

Slide 37

Slide 37 text

Shell script 是?  一連串的 commands  支援迴圈和條件判斷的語法

Slide 38

Slide 38 text

Why Shell Script?  取代重覆無聊的操作  自動化  想像一下  臨時需要5000個圖檔?  需要連續重覆執行測試程式一個星期  ...

Slide 39

Slide 39 text

簡單型式 #!/bin/sh Command1 Command2 ….

Slide 40

Slide 40 text

變數  VAR=1  VAR= 字串  使用 $ 取值  $VAR

Slide 41

Slide 41 text

環境變數  所有的 process 在 fork 都會繼承的變數  在單一 shell 下更改環境變數後,該 shell 之後 fork 的 process 環境變數都會繼承改變的環境 變數  範例  $PATH  $HOME  可以用 env 檢查環境變數

Slide 42

Slide 42 text

條件判斷 If [ 條件式 ] ; then Command1 Command2 … fi  可以判斷條件舉例  數字  字串  檔案  請 man [ [ 是一個執行檔

Slide 43

Slide 43 text

迴圈 while [ 條件 ] ; do Command1 Command2 … done

Slide 44

Slide 44 text

For 迴圈 for 變數 in list do Command1 Command2 … done List 使用 IFS 隔開

Slide 45

Slide 45 text

數學運算 $(( 數學運算 )) VAR=100 VAR=$(($VAR+1))

Slide 46

Slide 46 text

取得 command 輸出  $(command1)  `command1`  echo $(ls)

Slide 47

Slide 47 text

範例一:變數  PATH=$PATH:/home/user/bin  VAR=$((1+1))  VAR=$(echo test)  VAR=$?

Slide 48

Slide 48 text

範例二:列印 0~9 的迴圈 #!/bin/sh i=0 while [ $i -lt 10 ] ; do echo $i i=$(($i+1)) done

Slide 49

Slide 49 text

範例三:印出目前目錄詳細資料 #!/bin/sh files=$(ls) for i in $files do ls $i -al done

Slide 50

Slide 50 text

Outlines  Backgrounds  Command Lines  Shell Scripts  Regular Expression

Slide 51

Slide 51 text

Regular expression  一個描述字串 pattern 的語法,如  Lib 開頭 .a 結尾的字串  變數 my_var 被 assgin 的字串  注意 = 前後可能有 0 到多個空白  ...

Slide 52

Slide 52 text

80/20 法則 : 個人常用的語法  ^  一行的開始  $  一行的結束  *  零個或多個任何字元  .  單個任何字元

Slide 53

Slide 53 text

範例 grep  找出檔案裏面變數 my_var 被 assign 的行數  grep * -r my_var.*=  找出目錄下面所有 lib 開頭 .a 結尾的檔案  find | grep ^./lib.*\\.a$

Slide 54

Slide 54 text

範例 :vim  把每檔案一行最前面加上 PRE 的字串  %s/^/PRE_/g  把每檔案一行最後面加上分號  %s/$/;/g

Slide 55

Slide 55 text

實習時間 假設使用 gnome-terminal / X 環境 請打下面的指令 ls (enter) ls -al (enter) CTRL + R ( 再打 l) 第二次 CTRL + R

Slide 56

Slide 56 text

請打下面的指令 ls /tmp /usr Ctrl + a Ctrl + e Ctrl + w Ctrl + w Ctrl + w

Slide 57

Slide 57 text

請打下面的指令 echo hello world (enter) 滑鼠游標到顯示的 hello world 那行中的 world Double click ( 左鍵 ) Click ( 左鍵 ) echo 後 click 中鍵 echo 後按 shift + ins

Slide 58

Slide 58 text

請打下面的指令 echo hello world (enter) 滑鼠游標到顯示的 hello world 那行中的 world Double click ( 左鍵 ) Ctrl + shift + c echo 後 Ctrl + shift + v 再按 enter ctrl + l ctrl + shift + t

Slide 59

Slide 59 text

變數 , IFS 以及 quote VAR1=my test echo $VAR1 VAR1="my test" echo $VAR1 for i in $VAR1; do echo $i ; done

Slide 60

Slide 60 text

變數以及 quote VAR1="my test" echo $VAR1 echo “$VAR1” echo '$VAR1' echo \$VAR1

Slide 61

Slide 61 text

變數計算 VAR=1(enter) while [ $VAR -lt 100 ] ; do echo $((VAR++)) ; done (enter)

Slide 62

Slide 62 text

Job control vi (enter) Ctrl + z fg (enter) Quit vi

Slide 63

Slide 63 text

Job control while [ true ] ; do echo test ; sleep 5 ; done  Enter  Ctrl + c

Slide 64

Slide 64 text

Job control while [ true ] ; do echo test ; sleep 5 ; done &  Enter vi (enter) Ctrl + z jobs (enter) fg 1 (enter) Ctrl + c fg 2 (enter) Quit vi

Slide 65

Slide 65 text

Return value and conditional ls (enter) if [ $? = 0 ] ; then echo ok; else echo bad; fi (enter) ls --bad (enter) if [ $? = 0 ] ; then echo ok; else echo bad; fi (enter)

Slide 66

Slide 66 text

Return value and conditional ls && echo ok || echo bad ls --bad && echo ok || echo bad

Slide 67

Slide 67 text

Redirect ls / (enter) ls / > /dev/null (enter) ls / > /tmp/dct (enter) cat /tmp/dct (enter)

Slide 68

Slide 68 text

Redirect and fd rm /tmp/dct (enter) ls / --bad > /tmp/dct (enter) cat /tmp/dct (enter) ls / --bad 2> /tmp/dct (enter) cat /tmp/dct (enter)

Slide 69

Slide 69 text

pipeline ls /lib | grep lib.*\\.so$ (enter) rm -f /tmp/dct (enter) ls / | tee /tmp/dct (enter) cat /tmp/dct (enter)

Slide 70

Slide 70 text

Command Substitution and IFS echo $(ls /) echo `ls /` for i in $(ls /) ; do ls -ald /$i; done