1. 程式人生 > >bash shell學習筆記(一)—— 常用命令

bash shell學習筆記(一)—— 常用命令

排序 class $@ 幫助 row 自動 from quic 方式


一、基本的bash shell命令 1、默認bash shell 提示符是美元符號($); 2、bash手冊   使用man命令來訪問存儲在Linux系統上的手冊頁面,如:

bogon:~ Mac$ man kill

KILL(1) BSD General Commands Manual KILL(1)

NAME

kill -- terminate or signal a process

SYNOPSIS

kill [-s signal_name] pid ...

kill

-l [exit_status]

kill -signal_name pid ...

kill -signal_number pid ...

DESCRIPTION

The kill utility sends a signal to the processes specified by the pid op-

erands.

Only the super-user may send signals to other users‘ processes.

The options are as follows:

-s signal_name

A symbolic signal name specifying the signal to be sent instead

of the default TERM.

  使用關鍵字搜索手冊頁
語法:man -k 關鍵字
  如:查找與終端命令相關的命令,可以輸入man -k terminal 3、常見Linux目錄名稱 技術分享圖片 4、目錄知識
  • 單點符(.),表示當前目錄;
  • 雙點符(..),表示當前目錄的父目錄。
  • ls命令,顯示當前目錄下的文件和目錄
    • -F參數在目錄名後加了正斜線(/),以方便用戶在輸出中分辨它們,如:

bogon:Users Mac$ ls -F

Guest/ Mac/ Shared/

  • -R參數是ls命令可用的另一個參數,叫作遞歸選項。它列出了當前目錄下包含的子目錄中的文件。
  • 要把隱藏文件和普通文件及目錄一起顯示出來,就得用到-a參數。
  • 常用的參數是-l。-l參數會產生長列表格式的輸出,包含了目錄中每個文件的更多相關信息。

bogon:Users Mac$ ls -la

total 0

drwxr-xr-x 6 root admin 204 Jul 11 10:08 .

drwxr-xr-x 32 root wheel 1156 Oct 17 13:36 ..

-rw-r--r-- 1 root wheel 0 Jul 31 2016 .localized

drwxr-xr-x+ 12 Guest _guest 408 Feb 27 2017 Guest

drwxr-xr-x+ 39 Mac staff 1326 Oct 15 10:28 Mac

drwxrwxrwt 20 root wheel 680 Oct 13 16:52 Shared

  • 說明:
    • 文件類型 ,比如目錄 (d)、文件(-)、字符型文件(c)或塊設備 (b);
    • 文件的權限;
    • 文件的硬鏈接總數;
    • 文件屬主的用戶名;
    • 文件屬組的組名;
    • 文件的大小(以字節為單位);
    • 文件的上次修改時間 ;
    • 文件名或目錄名。
  • 問號(?)代表一個字符;
  • 星號(*)代表零個或多個字符。

$ ls -l my_scr?pt

-rw-rw-r-- 1 christine christine 0 May 21 13:25 my_scrapt
-rwxrw-r-- 1 christine christine 54 May 21 11:26 my_script
$

$ ls -l my*
-rw-rw-r-- 1 christine christine 0 May 21 13:25 my_file

-rw-rw-r-- 1 christine christine 0 May 21 13:25 my_scrapt

-rwxrw-r-- 1 christine christine 54 May 21 11:26 my_script

$

$ ls -l my_s*t
-rw-rw-r-- 1 christine christine 0 May 21 13:25 my_scrapt

-rwxrw-r-- 1 christine christine 54 May 21 11:26 my_script

$

$ ls -l my_scr[ai]pt
-rw-rw-r-- 1 christine christine 0 May 21 13:25 my_scrapt

-rwxrw-r-- 1 christine christine 54 May 21 11:26 my_script

$

$ ls -l f[a-i]ll
-rw-rw-r-- 1 christine christine 0 May 21 13:44 fall

-rw-rw-r-- 1 christine christine 0 May 21 13:44 fell

-rw-rw-r-- 1 christine christine 0 May 21 13:44 fill

$

$ ls -l f[!a]ll
-rw-rw-r-- 1 christine christine 0 May 21 13:44 fell

-rw-rw-r-- 1 christine christine 0 May 21 13:44 fill

-rw-rw-r-- 1 christine christine 0 May 21 13:44 full

$

5、創建文件:
  • 創建空文件夾:$touch test_one
  • 復制文件:$cp -i source destination
    • 當source和destination參數都是文件名時,cp命令將源文件復制成一個新文件,並且以 destination命名,-i 用於提示目標文件存在時是否覆蓋。
  • 制表鍵自動補全:輸入了命令cp really,然後按制表鍵,shell就將剩下的文件名自動補充完整了!
  • 要查看文件或目錄的inode 編號,可以給ls命令加入-i參數。
  • 移動(又名重命名文件):

    $ mv /home/christine/Pictures/fzll /home/christine/fall

  • 移除:在使用rm命令時,要養成總是加入-i參數的好習慣。
6、創建、刪除目錄:
  • 用mkdir命令即可:$ mkdir New_Dir
  • 刪除目錄的基本命令是rmdir。默認情況下,rmdir命令只刪除空目錄。
  • 一口氣刪除目錄及其所有內容的終極大法就是使用帶有-r參數和-f參數的rm命令,不會有提示,所有慎重。
$ rm -rf Small_Dir

7、查看文件內容

  • 查看文件類型,file命令

$ file my_file my_file: ASCII text

$

  • 查看整個文件:cat命令是顯示文本文件中所有數據的得力工具。
    • -n參數會給所有的行加上行號。

$ cat -n test1

1 hello

2

3 This is a test file.

4

5

6 That we‘ll use to test the cat command.

$

  • 如果只想給有文本的行加上行號,可以用-b參數。
  • 如果不想讓制表符出現,可以用-T參數。-T參數會用^I字符組合去替換文中的所有制表符。
  • cat命令的主要缺陷是:一旦運行,你就無法控制後面的操作。為了解決這個問題,開發人員編寫了more命令。more命令會顯示文本文件的內容,但會在顯示每頁數據之後停下來。
  • less命令的命名實際上是個文字遊戲(從俗語“less is more”得來),它實為more命令的升級版。一次顯示一屏的文件文本。它提供了一些極為實用的特性,能夠實現在文本文件中前後翻動,而且還有一些高級搜索功能。
  • tail命令會顯示文件最後幾行的內容(文件的“尾部”)。默認情況下,它會顯示文件的末 尾10行。
    • 可以向tail命令中加入-n參數來修改所顯示的行數。通過加入-n 2使tail命令只顯示文件的最後兩行:
$ tail -n 2 log_file line19 Last line - line20 $
  • head命令,會顯示文件開頭那些行的內容。它也支持-n參數,這樣就可以指定想要顯示的內容了。
二、更多的bash shell命令 1、探查進程:   ps命令能輸出運行在系統上的所有程序的許多信息。它只能顯示某個特定時間點的信息。   -e參數指定顯示所有運行在系統上的進程;-f參數則擴展了輸出,這些擴展的列包含了有用的信息。 技術分享圖片
  • UID:啟動這些進程的用戶。
  • PID:進程的進程ID。
  • PPID:父進程的進程號(如果該進程是由另一個進程啟動的)。
  • C:進程生命周期中的CPU利用率。
  • STIME:進程啟動時的系統時間。
  • TTY:進程啟動時的終端設備.
  • TIME:運行進程需要的累計CPU時間。
  • CMD:啟動的程序名稱。
2、實時監測進程: top命令跟ps命令相似,能夠顯示進程信息,但它是實時顯示的。 技術分享圖片
  • PID:進程的ID。
  • USER:進程屬主的名字。
  • PR:進程的優先級。
  • NI:進程的謙讓度值。
  • VIRT:進程占用的虛擬內存總量。
  • RES:進程占用的物理內存總量。
  • SHR:進程和其他進程共享的內存總量。
  • S:進程的狀態(D代表可中斷的休眠狀態,R代表在運行狀態,S代表休眠狀態,T代表跟蹤狀態或停止狀態,Z代表僵化狀態)。
  • %CPU:進程使用的CPU時間比例。
  • %MEM:進程使用的內存占可用內存的比例。
  • TIME+:自進程啟動到目前為止的CPU時間總量。
  • COMMAND:進程所對應的命令行名稱,也就是啟動的程序名。
3、結束進程:kill命令可通過進程ID(PID)給進程發信號,只能用進程的PID而不能用命令

  要發送進程信號,你是進程的屬主或登錄為root用戶。

$ kill 3940
-bash: kill: (3940) - Operation not permitted
$
  killall命令非常強大,它支持通過進程名而不是PID來結束進程。killall命令也支持通配符,這在系統因負載過大而變得很慢時很有用。
$ killall http* $
  上例中的命令結束了所有以http開頭的進程,比如Apache Web服務器的httpd服務。   警告:以root用戶身份登錄系統時,使用killall命令要特別小心,因為很容易就會誤用通配符而結束了重要的系統進程。這可能會破壞文件系統。 4、處理數據文件
  • 排序數據:
    • sort命令按照會話指定的默認語言的排序規則對文本文件中的數據行排序。
    • 可用-n參數,它會告訴sort命令把數字識別成數字而不是字符,並且按值排序
    • 另一個常用的參數是-M,按月排序。
    • -k和-t參數在對按字段分隔的數據進行排序時非常有用,例如/etc/passwd文件。可以用-t 參數來指定字段分隔符,然後用-k參數來指定排序的字段。
$ sort -t ‘:‘ -k 3 -n /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin $
  • 搜索數據:用grep命令來幫助查找就行了。grep命令的命令行格式如下。
$ grep [options] pattern [file]
    • 如果要進行反向搜索(輸出不匹配該模式的行),可加-v參數。
    • 如果要顯示匹配模式的行所在的行號,可加-n參數。
    • 如果只要知道有多少行含有匹配的模式,可用-c參數。
    • 如果要 定多個 式,可用-e參數來定每個模式。
$ grep -e t -e f file1
    two
    three
    four
  five
$
5、壓縮數據

  gzip是Linux上最流行的壓縮工具。

  • gzip:用來壓縮文件。
  • gzcat:用來查看壓縮過的文本文件的內容。
  • gunzip:用來解壓文件。

$ gzip myprog

$ ls -l my*

-rwxrwxr-x 1 rich rich 2197 2007-09-13 11:29 myprog.gz
$

6、歸檔數據

  tar命令最開始是用來將文件寫到磁帶設備上歸檔的,然而它也能把輸出寫到文件 ,這種用法在Linux上已經普遍用來歸檔數據了。

tar命令的格式: tar function [options] object1 object2 ...

  function參數定義了tar命令應 做什麽,如表4-8所示。

技術分享圖片

  每個功能可用選項來針對tar歸檔文件定義一個特定行為。表4-9列出了這些選項中能和tar命令一起使用的常見選項 。

技術分享圖片

  下載開源軟件之後,你會經常看到文件名以.tgz結尾。這些是gzip壓縮過的tar文件可以用命令tar -zxvf filename.tgz 來解壓。

三、理解shell 四、使用Linux環境變量 系統環境變量基本上都是使用全大寫字母,以區別於普通用戶的環境變量。 要查看全局變量,可以使用env或printenv命令。 在echo命令中,在變量名前加上$可不僅僅是要顯示變量當前的值。它能夠讓變量作為命令 行參數。 變量名、等號和值之間沒有空格,這一點非常重要。如果是你自己創建的局 部變量或是shell腳本,請使用小寫字母。 root用戶賬戶是Linux系統的管理員,固定分配給它的UID是0。 使用文件權限符
  • -代表文件
  • d代表目錄
  • l代表鏈接
  • c代表字符型設備 ? b代表塊設備
  • n代表網絡設備 之後有3組三字符的編碼。每一組定義了3種訪問權限:
  • r代表對象是可讀的
  • w代表對象是可寫的
  • x代表對象是可執行的 若沒有某種權限,在該權限位會出現單破折線。這3組權限分別對應對象的3個安全級別: ?
? 對象的屬主 ? 對象的屬組 ? 系統其他用戶 改變權限 chmod命令用來改變文件和目錄的安全性設置。該命令的格式如下: chmod options mode file 後面跟著的符號表示你是想在現有權限基礎上增加權限(+),還是在現有權限基礎上移除權限(-?),或是將權限設置成後面的值(=)。 x:如果對象是目錄或者它已有執行權限,賦予執行權限。 ? s:運行時重新設置UID或GID。 ? t:保留文件或目錄。 ? u:將權限設置為跟屬主一樣。 g:將權限設置為跟屬組一樣。 ? o:將權限設置為跟其他用戶一樣。 vim編輯器有兩種操作模式: ? 普通模式 ? 插入模式 當你剛打開要編輯的文件時(或新建一個文件時),vim編輯器會進入普通模式。在普通模式 中,vim編輯器會將按鍵解釋成命令(本章後面會討論更多)。 在插入模式下,vim會將你在當前光標位置輸入的每個鍵都插入到緩沖區。按下i鍵就可以進 入插入模式。要退出插入模式回到普通模式,按下鍵盤上的退出鍵(ESC鍵,也就是Escape鍵) 就可以了。 在普通模式中,可以用方向鍵在文本區域移動光標(只要vim能正確識別你的終端類型)。如 果你恰巧在一個古怪的沒有定義方向鍵的終端連接上,也不是完全沒有希望。vim中有用來移動 光標的命令。 ? h:左移一個字符。 ? j:下移一行(文本中的下一行)。 ? k:上移一行(文本中的上一行)。 ? l:右移一個字符。 在大的文本文件中一行一行地來回移動會特別麻煩,幸而vim提供了一些能夠提高移動速度 的命令。 ? Ctrl+F:下翻一屏。 ? Ctrl+B:上翻一屏。 ? G:移到緩沖區的最後一行。 ? num G:移動到緩沖區中的第num行。 ? gg:移到緩沖區的第一行。 vim編輯器在普通模式下有個特別的功能叫命令行模式。命令行模式提供了一個交互式命令 行,可以輸入額外的命令來控制vim的行為。要進入命令行模式,在普通模式下按下冒號鍵。光 標會移動到消息行,然後出現冒號,等待輸入命令。 在命令行模式下有幾個命令可以將緩沖區的數據保存到文件中並退出vim。 ? q:如果未修改緩沖區數據,退出。 ? q!:取消所有對緩沖區數據的修改並退出。 ? w filename:將文件保存到另一個文件中。 ? wq:將緩沖區數據保存到文件中並退出。 變量每次被引用時,都會輸出當前賦給它的值。重要的是要記住,引用一個變量值時需要使 用美元符,而引用變量來對其進行賦值時則不要使用美元符。 最基本的重定向將命令的輸出發送到一個文件中。bash shell用大於號(>)來完成這項功能: command > outputfile 可以用雙大於號(>>)來追加數據。 輸入重定向符號是小於號(<) wc命令可以對對數據中的文本進行計數。默認情況下,它會輸出3個值: ? 文本的行數 ? 文本的詞數 8 ? command1 | command2 Linux系統實際上會同時運行這兩個命令,在 系統內部將它們連接起來。在第一個命令產生輸出的同時,輸出會被立即送給第二個命令。數據 傳輸不會用到任何中間文件或緩沖區。文本的字節數 在將一個數學運算結果賦給某個變量時,可以用美元符和 方括號($[ operation ])將數學表達式圍起來。 $ var2=$[$var1 * 2] $ echo $var2 在腳本中使用bc: 最好的辦法是使用內聯輸入重定向,它允許你直接在命令行中重定向數據。在shell腳本中, 你可以將輸出賦給一個變量。 variable=$(bc << EOF options statements expressions EOF ) 示例: #!/bin/bash var1=10.46 var2=43.67 var3=33.2 var4=71 var5=$(bc << EOF scale = 4 a1 = ( $var1 * $var2) b1 = ($var3 * $var4) a1 + b1 EOF ) echo The final answer for this mess is $var5 退出腳本:shell中運行的每個命令都使用退出狀態碼(exit status)告訴shell它已經運行完畢。退出狀態 碼是一個0~255的整數值,在命令結束運行時由命令傳給shell。可以捕獲這個值並在腳本中使用。 Linux提供了一個專門的變量$?來保存上個已執行命令的退出狀態碼。按照慣例,一個成功結束的命令的退出狀態碼是0。 exit命令:exit命令允許你在腳本結束時指定一個退出狀態碼。 最基本的結構化命令就是if-then語句。if-then語句有如下格式。 if command then commands fi if command1 then command set 1 elif command2 then command set 2 elif command3 then command set 3 elif command4 then command set 4 fi 記住,在elif語句中,緊跟其後的else語句屬於elif代碼塊。它們並不屬於之前的 if-then代碼塊。 bash shell提供了另一種條件測試方法,無需在if-then語句中聲明test命令。 if [ condition ] then commands fi 方括號定義了測試條件。註意,第一個方括號之後和第二個方括號之前必須加上一個空格, 否則就會報錯。 test命令可以判斷三類條件: ?數值比較 ?字符串比較 技術分享圖片

技術分享圖片

技術分享圖片

雙括號命令的格式如下:

(( expression )) 雙方括號命令的格式如下: [[ expression ]] case命令會采用列表格式來檢查單個變量的多個值。 case variable in pattern1 | pattern 2) commands1;; pattern3) commands2;; *) default commands;; esac bash shell中for命令的基本格式。 for var in list do commands done 環境變量IFS,叫作內部字段分隔符(internal field separator)。 如設置換行符為分隔符:IFS=$‘\n‘ C 的for命令 格式 for (( variable assignment ; condition ; iteration process )),如: for (( a = 1; a < 10; a++ )) 註意 ,有些部分並 有 bash shell 的for命令: 變量 可以有 空格; 條件中的變量不以美元符開頭 ; 叠代過程的算式未用expr命令格式。 $ cat test8 #!/bin/bash # testing the C-style for loop for (( i=1; i <= 10; i++ )) do echo "The next number is $i" done $ ./test8 The next number is 1 The next number is 2 The next number is 3 The next number is 4 The next number is 5 The next number is 6 The next number is 7 The next number is 8 The next number is 9 The next number is 10 $ 多變量 $ cat test9 #!/bin/bash # multiple variables for (( a=1, b=10; a <= 10; a++, b-- )) do echo "$a - $b" done $ ./test9 1 - 10 2-9 3-8 4-7 5-6 6-5 7-4 8-3 9-2 10 - 1 $ while命令的基本格式是: while test command do other commands done 停止正在運行的命令:Ctrl+C 特殊變量$#含有腳本運行時攜帶的命令行參數的個數。 當命令行上沒有任何參數時,$#的值為0, params變量的值也一樣,但${!#}變量會返回命令行用到的腳本 。 $*變量會將命令行上提供的所有參數當作一個單詞保存。這個單詞包含了命令行中出現的每 一個參數 。基本上$*變量會將這些參數視為一個整體,而不是多個個體。 $@變量會將命令行上提供的所有參數當作同一字符串中的多個獨立的單詞 。這樣你就能遍歷所有的參數值 ,得到每個參數。這通常通過for命令完成。 移動變量:在使用shift命令時,默認情況下它會將每個參數變量向左移動一個位置 。所以,變量$3 的值會移到$2中,變量$2的值會移到$1中,而變量$1的值則會被刪除(註意變量$0的值,也就是程序名,不會改變)。 可以一 性移動多個位置,只需要 shift命令提供一個參數,指明要移動的位置數就行了。 使用shift命令的時候要小心 。如果摸個參數被移出,它的值就被丟棄了,無法再恢復。 shell會用雙破折線來表明列表結束 。在雙破折線之後,腳本就可以放心地將剩下的命令行參數當作參數,而不是選項來處理了。 使用getopts命令 : getopts命令的 式如下: getopts optstring variable 有效的選項字母都會列在optstring中,如果選項要求有個參數值,就加一個冒號 。要 去掉錯誤的信息的話,可以在optstring之前加一個冒號 。getopts命令將當前參數保存在命令行中定義的variable中。 $ cat test19.sh #!/bin/bash # simple demonstration of the getopts command # echo while getopts :ab:c opt do case "$opt" in a) echo "Found the -a option" ;; b) echo "Found the -b option, with value $OPTARG";; c) echo "Found the -c option" ;; *) echo "Unknown option: $opt";; esac done $ $ ./test19.sh -ab test1 -c Found the -a option Found the -b option, with value test1 Found the -c option $ 技術分享圖片

獲得用戶輸入 基本的讀取:read命令從標準輸入(鍵盤 )或另一個文件描述符中接受輸入。 生成提示的echo命令使用了-n選項 。 該選項不會在字符串末尾輸出換行 ,允許腳本用戶緊跟其後輸入數據,而不是下一行。 實際上,read命令包了-p ,允許你直接在read命令行指定提示符 。 超時:-t 選項指定了read命令等待輸入的秒數。當計時器過期後,read命令會返回一個非零退出態碼。 #!/bin/bash # timing the data entry if read -t 5 -p "Please enter your name: " name then echo "Hello $name, welcome to my script" else echo echo "Sorry,too slow!" fi $ ./test25.sh Please enter your name: Sorry, too slow! $ 可以不對輸入過程計時,而是讓read命令來統計輸入的字符數。當輸入的字符達到預設的字符數時,就自動退出,將輸入的數據賦給變量。 $ #!/bin/bash # getting just one character of input # read -n1 -p "Do you want to continue [Y/N]? " answer case $answer in Y | y) echo echo "fine, continue on..." ;; N | n) echo echo OK, goodbye exit ;; esac echo "This is the end of the script " $ ./test26.sh Do you want to continue [Y/N]? y fine, continue on... This is the end of the script $ 隱藏方式讀取 有時你需要從腳本用戶處得到輸入,但又在屏幕顯示輸入信息。其中典型的例子就是輸入的密碼,但除之外還有很多其他需要隱藏的數據類型 。 -s選項可以避免在read命令中輸入的數據出現在顯示器上(實際上,數據會被顯示,只是 read命令會將文本顏色設成跟背景色一樣)。 #!/bin/bash # hiding input data from the monitor # read -s -p "Ener your password: " pass echo echo "Is your password really $pass?" $ ./test27.sh Ener your password: Is your password really df? $ 從文件中讀取: $ cat test28.sh #!/bin/bash # reading data from a file # count=1 cat test | while read line do echo "Line $count: $line" count=$[ $count + 1] done echo "Finished processing the file" $ $ cat test The quick brown dog jumps over the lazy fox. This is a test, this is only a test. O Romeo, Romeo! Wherefore art thou Romeo? $ $ ./test28.sh Line 1: The quick brown dog jumps over the lazy fox. Line 2: This is a test, this is only a test. Line 3: O Romeo, Romeo! Wherefore art thou Romeo? Finished processing the file $ 標準文件描述符: 技術分享圖片

對終端界面來說,標準輸入是鍵盤。標準輸出就是終端顯示器。 $ ls -al test test2 test3 badtest 2> test6 1> test7 $ cat test6 ls: cannot access test: No such file or directory ls: cannot access badtest: No such file or directory $ cat test7 -rw-rw-r-- 1 rich rich 158 2014-10-16 11:32 test2 -rw-rw-r-- 1 rich rich 0 2014-10-16 11:33 test3 $ shell利用1>符號將ls命令的正常輸出重定向到了test7文件,錯誤信息通過2>符合重定向到了test6文件。 重定向到同一個輸出文件則使用重定向符號 &> 。 臨時重定向:如果有意在腳本中生成錯誤信息,可以將單獨的一行輸出重定向到STDERR。你所需要做的是使用輸出重定向符來將輸出信息重定向到STDERR文件描述符。在重定向到文件描述符時,你必須在文件描述符數字之前加一個&: echo "This is an error message" >&2 永久重定向: 用exec命令告訴shell在腳本執行期重定向某個特定文件描述符 。 $ cat test10 #!/bin/bash # redirecting all output to a file exec 1>testout echo "This is a test of redirecting all output" echo "from a script to another file." echo "without having to redirect every individual line" $ ./test10 $ cat testout This is a test of redirecting all output from a script to another file. without having to redirect every individual line $

bash shell學習筆記(一)—— 常用命令