bash shell學習筆記(一)—— 常用命令
一、基本的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
$
5、創建文件:$ 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
$
- 創建空文件夾:$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參數的好習慣。
- 用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參數,這樣就可以指定想要顯示的內容了。
- UID:啟動這些進程的用戶。
- PID:進程的進程ID。
- PPID:父進程的進程號(如果該進程是由另一個進程啟動的)。
- C:進程生命周期中的CPU利用率。
- STIME:進程啟動時的系統時間。
- TTY:進程啟動時的終端設備.
- TIME:運行進程需要的累計CPU時間。
- CMD:啟動的程序名稱。
- PID:進程的ID。
- USER:進程屬主的名字。
- PR:進程的優先級。
- NI:進程的謙讓度值。
- VIRT:進程占用的虛擬內存總量。
- RES:進程占用的物理內存總量。
- SHR:進程和其他進程共享的內存總量。
- S:進程的狀態(D代表可中斷的休眠狀態,R代表在運行狀態,S代表休眠狀態,T代表跟蹤狀態或停止狀態,Z代表僵化狀態)。
- %CPU:進程使用的CPU時間比例。
- %MEM:進程使用的內存占可用內存的比例。
- TIME+:自進程啟動到目前為止的CPU時間總量。
- COMMAND:進程所對應的命令行名稱,也就是啟動的程序名。
要發送進程信號,你是進程的屬主或登錄為root用戶。
killall命令非常強大,它支持通過進程名而不是PID來結束進程。killall命令也支持通配符,這在系統因負載過大而變得很慢時很有用。$ kill 3940 -bash: kill: (3940) - Operation not permitted $
$ 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參數來定每個模式。
5、壓縮數據$ grep -e t -e f file1 two three four
five
$
gzip是Linux上最流行的壓縮工具。
- gzip:用來壓縮文件。
- gzcat:用來查看壓縮過的文本文件的內容。
- gunzip:用來解壓文件。
6、歸檔數據$ gzip myprog
$ ls -l my*
-rwxrwxr-x 1 rich rich 2197 2007-09-13 11:29 myprog.gz
$
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個安全級別: ?
雙括號命令的格式如下:
(( 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學習筆記(一)—— 常用命令