Linux Shell概述和Bash基本功能

1. Shell概述

 1.1 概念

這裏可以分兩個方面來理解:

  • 是一個命令行解釋器。它爲用戶提供了一個像Linux內核發送請求以便運行程序的界面系統程序,用戶可以通過shell來啓動、掛起、停止甚至是編寫一些程序。
  • shell還是一個功能相當強大的編程語言,易編寫,易調試,靈活性強。Shell是解釋執行的腳本語言,在Shell中可以直接調用Linux系統命令。

 1.2 Shell 分類

  • Bourne shell:從1979起Unix就開始使用 Bourne Shell,Bourne Shell的主文件名爲 sh。
  • C Shell: C Shell主要在BSD版的Unix系 統中使用,其語法和C語言相類似而得名。
  • Shell的兩種主要語法類型有Bourne和C, 這兩種語法彼此不兼容。Bourne家族主要包括sh、ksh、Bash、psh、zsh;C家族主 要包括:csh、tcsh
  • Bash: Bash與sh兼容,是Linux系統默認使用的Shell。

其實可以這樣理解:Shell是一種編程語言,而Bash是它的語法。

 1.3 查看你的Linux所支持的Shell

[cfp@bogon ~]$ cat /etc/shells

2. Shell腳本的執行方式

 2.1 echo命令

echo輸出命令:
       -e 支持反斜線控制字符轉換

控制字符 作用
\\ 輸出\本身
\a 輸出警告本身
\b 退格鍵,也就是向左刪除鍵
\c 取消輸出行末的換行符。和“-n”選項一致
\e ESCAPE鍵
\f 換頁符
\n 換行符
\r 回車鍵
\t 製表符
\v 垂直製表符
\0nnn 按照八進制ASCII碼錶輸出字符。其中0爲數字0,nnn是三位八進制
\xhh 按照十六進制ASCII碼錶輸出字符。q其中hh是兩位十六進制數

實例

[root@bogon ~]$ echo -e "ab\bc"
ac
[root@bogon ~]$ echo -e "a\tb\tc\nd\te\tf"
a	b	c
d	e	f
[root@bogon ~]$ echo -e "\e[1;31m abcd \e[0m"
 abcd    #這是紅色的!
 #30m=黑色,31m=紅色,32m=綠色,33m=黃色
 #34m=藍色,35m=洋紅,36m=青色,37m=白色

 2.2 第一個腳本的完整代碼

第一個腳本的完整代碼:輸出hello world

#!/bin/bash

  這裏要說明以下,編寫Shell腳本的時候,上面這句代碼是放在腳本開頭的,它不是一句註釋,而是用這個語句來標識以下輸入都是shell腳本。

[root@bogon ~]$ mkdir /tmp/sh   #創建一個sh目錄
[root@bogon ~]$ touch /tmp/sh/hello.sh  #在sh目錄目錄下創建一個hello.sh文件
[root@bogon ~]$ vi /tmp/sh/hello.sh   #編輯這個文件
#!/bin/bash        
#name Mrs Chen     #這一行是註釋
#Data 2020/3/1		#這一行是註釋
echo "hello world"   #輸出hello world
[root@bogon ~]$ bash /tmp/sh/hello.sh
hello world

 2.3 腳本執行的方式

腳本的執行一般有兩種方式:
(1) 賦予執行權限,直接運行。分兩步:

  • chmod 755 文件名
  • 文件絕對路徑或相對路徑
[root@bogon ~]$ chmod 755 /tmp/sh/hello.sh
[root@bogon ~]$ /tmp/sh/hello.sh
hello world

(2) 通過bash調用執行腳本:

  • bash 文件絕對路徑或相對路徑
[root@bogon ~]$ bash /tmp/sh/hello.sh
hello world

3.Bash的基本功能

 3.1 歷史命令

語法: history [選項] [歷史命令保存文件]
選項:
   -c 清空歷史命令
   -w 把緩存中的歷史命令寫入歷史命令保存文件.bash_history (在家目錄下)。 ”.“ 表示該文件是隱藏文件
範例:[root@bogon ~]$ history

歷史命令默認會保存1000條,可以在環境配置文件/etc/profile中進行修改:找到“HISTSIZE=1000“這句代碼,將數字修改就行。

歷史命令的調用:

  • 使用上下、箭頭調用以前的歷史命令(最常用的方法)
  • 使用“!n”重複執行第n條命令,n是用history查詢到的。
  • 使用“!!”重複執行上一條命令
  • 使用"!字串"重複執行最後一條以該字符串開頭的命令

 3.2 命令與文件的補全

  在Bash中,命令與文件補全是非常方便與常用的功能,我們只要在輸入命令或文時,按“Tab”鍵就會自動補全。
  但這裏要注意的是,如果有多條命令與你所打的相符合,按一下”Tab“鍵沒用。按兩下”Tab“,可以查看與你所打相符合的所有命令,然後自己再選擇。

 3.3 Bash常用快捷鍵與命令別名

Bash常用快捷鍵

快捷鍵 作用
ctrl+a 把光標移動到命令行開頭
ctrl+e 把光標移動到命令行結尾
ctrl+c 強制終止當前命令
ctrl+l 清屏,相當於clear命令
ctrl+u 刪除或剪切光標之前的命令
ctrl+k 刪除或剪切光標之後的命令
ctrl+y 粘貼ctrl+u或ctrl+k剪切的內容
ctrl+r 在歷史命令中搜索,按下ctrl+r之後,就會出現搜索界面,只要輸入搜索內容,就會從歷史命令中搜索
ctrl+d 退出當前終端

命令別名:
  命令別名指的是,如過A命令很長、很難記住或者很難打,就把這個命令製作一個別名,以後就使用這個別名來代替A命令。下面是製作方法:

[root@bogon ~]$ alias 別名=‘原命令’   #設定命令別名
[root@bogon ~]$ alias   #查詢命令別名
[root@bogon ~]$ unalias 別名   #刪除別名

  按照如上步驟,僅僅是在終端沒被關閉之前有效。一旦終端關閉後,上邊的操作都會無效。將設定命令別名的這個命令,加入到這個文件中, 讓別名永久生效. bashrc是家目錄下面的文件,是一個隱藏文件。

[root@bogon ~]$ vi  .bashrc
# .bashrc
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# Source global definitions
if [ -f /etc/bashrc ]; then
	. /etc/bashrc
fi

  PS:設定別名的時候,一定要注意!你要確定別名和系統自帶的一些命令不會重疊!!

 3.4 輸入輸出重定向

設備 設備文件名 文件描述符 類型
鍵盤 /dev/sdtin 0 標準輸入
顯示器 /dev/sdtout 1 標準輸出
顯示器 /dev/sdterr 2 標準錯誤輸出

  輸出重定向,就是將本該輸出在顯示器上的內容,重定向輸出到文件中。輸出重定向很常見,是Linux裏面很重要的一個命令。

標準輸出重定向

符號 作用
命令 > 文件 以覆蓋的方式,把命令的正確輸出輸出到指定文件或設備當中
命令 >> 文件 以追加的方式,把命令的正確輸出輸出到指定文件或設備當中

標準錯誤輸出重定向

符號 作用
錯誤命令 2> 文件 以覆蓋的方式,把命令的錯誤輸出輸出到指定文件或設備當中
錯誤命令 2>> 文件 以追加的方式,把命令的錯誤輸出輸出到指定文件或設備當中

  一般上邊兩種不常用。因爲如果可以已經知道命令是錯誤的,改正不就行了?所以就有了下面這個最常用的

正確輸出和錯誤輸出同時保存

符號 作用
命令 &>文件 以覆蓋的方式,把命令的正確輸出、錯誤輸出輸出到指定文件或設備當中 (注意,最後一個“文件”前面沒有空格!!)
命令 &>>文件 以追加的方式,把命令的正確輸出、錯誤輸出輸出到指定文件或設備當中 (注意,最後一個“文件”前面沒有空格!!)
命令 >> 文件1 2>>文件2 把正確的的輸出追加到文件1中,把錯誤的輸出追加到文件2中 (注意,最後一個“文件”前面沒有空格!!)

實例講解:

[root@bogon ~]$ ls .user &>./text/a.txt    #將命令ls .user的結果輸出到文件./text/a.txt中
[root@bogon ~]$ cat ./text/a.txt    #查看./text/a.txt文件
ls: cannot access '.user': No such file or directory

  輸入重定向,就是將文件中的內容作爲輸入,不再用鍵盤輸入。輸入重定向在Linux中基本用不到,瞭解這個概念就行,主要會使用輸出重定向即可。

 3.5 多命令順序執行與管道符

(1)多命令執行順序:

多命令執行符 格式 作用
; 命令1 ; 命令2 多個命令順序執行,命令之間沒有任何邏輯聯繫
&& 命令1 && 命令2 邏輯與,當命令1正確執行,則命令2纔會執行。
|| 命令1 || 命令2 邏輯或,當命令1執行不正確,則命令2纔會執行

實例講解:

[root@bogon ~]$ ls ; cd /user ; date
Desktop  Documents  Downloads  Music  Pictures  Public  Videos
bash: cd: /user: No such file or directory
Mon 02 Mar 2020 04:50:51 PM CST
#第二行的內容打印的是第一個命令“ls”。第三行的內容是打印第二個命令“cd/user”。
#第四行的內容是打印第三個命令“date”。
[root@bogon ~]$ date ; dd if=/dev/zero of=/root/testfile bs=1k count=100000 ; date
#將/dev/zero中的內容寫入到文件/root/testfile下面,寫入98M大小的數據。

dd 命令
功能描述:複製文件並對原文件內容進行轉換和格式化處理
語法:dd if=輸入文件 of=輸出文件 bs=字節數 count=個數
 選項:
  if=輸入文件  指定源文件或源設備
  of=輸出文件  指定目標文件或目標設備
  bs=字節數   指定一次輸入/輸出多少個字節,即把這些字節看做一個數據塊
  count=個數   指定輸入/輸出多少個數據塊
範例:$ date ; dd if=/dev/zero of=/root/testfile bs=1k count=100000 ; date

(2)管道符:
命令格式:[root@bogon ~]$ 命令1 | 命令2
功能描述:命令1的正確輸出作爲命令2的執行對象

[root@bogon ~]$ ll -a /etc/ |more   #將命令ll -a /etc/的輸出按頁顯示
[root@bogon ~]$ netstat -an |grep "ESTABLISHED" #在netstst -an命令的輸出中查找字符串“ESTABLISHED“

grep命令:
功能描述:一個強大的文本搜索工具
語法:grep [選項] “搜索內容” 文件名
選項:
  -i:忽略大小寫
  -n: 輸出行號
  -v: 反向查找
  --color=auto 搜索出的關鍵字用顏色顯示
範例:$ grep -n "root" /etc/passwd

 3.6 通配符與其他特殊符號

  Linux中通配符是用來匹配文件名的。通配符的含義和正則表達式的含義比較像,但是有區別。Linux中常見的通配符如下:

通配符 作用
? 匹配一個任意字符
* 匹配0個或任意多個任意字符,也就是可以匹配任何內容
[ ] 匹配括號中任意一個字符。例如:[abc]代表一定匹配一個字符,或者是a,或者是b,或者是c
[ - ] 匹配括號中任意一個字符,- 代表一個範圍,例如:[a-z]代表匹配一個小寫字母
[ ^ ] 邏輯非,表示匹配不是括號內的一個字符。例如:[^0-9]代表匹配一個不是數字的字符

通配符的實例如下:

[cfp@bogon ~]$ touch abc   #在家目錄下創建一個abc文件
[cfp@bogon ~]$ touch abcd    #在家目錄下創建一個abcd文件
[cfp@bogon ~]$ touch 012
[cfp@bogon ~]$ touch 0abc
[cfp@bogon ~]$ ls ?abc    #在家目錄下搜索一個文件名爲:任一字符+abc 的文件
0abc
[cfp@bogon ~]$ ls [0-9]*
012  0abc
[cfp@bogon ~]$ ls *abc
0abc  aabc  abc

  Bash中其他特殊符號

符號 作用
‘ ’ 單引號。在單引號中所有的特殊符號,如“$”和"`"(反引號)都沒有特殊含義
" " 雙引號。在雙引號中特殊符號都沒有特殊含義,但是“$”、"`"、"\"是例外,擁有“調用變量的值”、“引用命令”、“轉義符”的特殊含義
`` 反引號。反引號括起來的內容是系統命令,在Bash中會先執行它。和()()作用一樣,不過推薦(),因爲反引號非常容易看錯
$() 和反引號一樣,用來引用系統命令
# 在Shell腳本中,#開頭的行代表註釋
$ 用於調用變量的值,如果需要調用變量name的值時,需要用$name的方式得到變量的值
\ 轉義符,跟在\之後的特殊符號將失去特殊符號含義,變爲普通字符

特殊符號的實例如下(按着例子來理解特殊符號的含義):
[cfp@bogon ~]$ name=sc   
[cfp@bogon ~]$ echo name
name
[cfp@bogon ~]$ echo $name
sc
[cfp@bogon ~]$ echo $(date)
Tue 03 Mar 2020 03:43:30 PM CST
[cfp@bogon ~]$ echo date
date
[cfp@bogon ~]$ echo "$(date)"  #雙引號
Tue 03 Mar 2020 03:45:00 PM CST
[cfp@bogon ~]$ echo '$(date)'  #單引號
$(date)
[cfp@bogon ~]$ echo `date`    #反引號
Tue 03 Mar 2020 03:43:53 PM CST

4.總結

  文章簡單介紹了Shell的概念以及一些常見的用法。原理+實例,讓讀者能更容易理解,更容易記住。本篇文章只是Shell的起步文章,後面會接着更新Shell編程和其他的一些Shell基礎性內容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章