Linux Shell程式設計(1) – Bash 的基本功能:別名、快捷鍵、歷史命令、輸出重定向、管道符、Shell中特殊符號

白菜1031發表於2019-02-16

Bash 的基本功能

一、命令別名

1. 命令生效的順序

  1. 執行使用絕對路徑或相對路徑執行的命令
  2. 執行別名
  3. 執行Bash內部命令
  4. 執行按照 $PATH 環境變數定義的目錄順序查詢到的第一個命令

2. 檢視別名

命令格式

alias [別名]

例項

[vagrant/tmp] ]$alias
alias grep=`grep --color=auto`
alias l=`ls -CF`
alias la=`ls -A`
alias ll=`ls -AlhF --color=auto`
alias ls=`ls --color=auto`
alias vi=`vim`
[vagrant/tmp] ]$alias ls
alias ls=`ls --color=auto`
[vagrant/tmp] ]$alias cp
-bash: alias: cp: not found

3. 設定別名

命令格式

alias 別名=`命令 引數`

例項

[vagrant/tmp] ]$alias cat=`cat -n`
[vagrant/tmp] ]$alias less=`less -mN`
[vagrant/tmp] ]$alias
alias cat=`cat -n`
alias grep=`grep --color=auto`
alias l=`ls -CF`
alias la=`ls -A`
alias less=`less -mN`
alias ll=`ls -AlhF --color=auto`
alias ls=`ls --color=auto`
alias vi=`vim`

設定別名永久生效

在上面的命令列中那樣設定別名,別名只能在當前bash中使用,且一旦退出登入,別名便會失效。
若要使別名永久生效,需要將該別名新增到 ~/.bashrc 配置檔案中。

  • ~/.bashrc 檔案
# some more ls aliases
alias grep=`grep --color=auto`
alias ll=`ls -AlhF --color=auto`
alias la=`ls -A`
alias l=`ls -CF`
alias vi=`vim`
alias cat=`cat -n`
alias less=`less -mN`

4. 刪除別名

命令格式

unalias 別名

例項

[vagrant/tmp] ]$alias
alias cat=`cat -n`
alias grep=`grep --color=auto`
alias l=`ls -CF`
alias la=`ls -A`
alias less=`less -mN`
alias ll=`ls -AlhF --color=auto`
alias ls=`ls --color=auto`
alias vi=`vim`
[vagrant/tmp] ]$unalias grep
[vagrant/tmp] ]$unalias cat
[vagrant/tmp] ]$alias
alias l=`ls -CF`
alias la=`ls -A`
alias less=`less -mN`
alias ll=`ls -AlhF --color=auto`
alias ls=`ls --color=auto`
alias vi=`vim`

刪除別名永久生效

與設定別名一樣,若要永久刪除別名,將該別名從 ~/.bashrc 配置檔案中刪除即可。

二、常用快捷鍵

Ctrl + c :強制停止當前命令
Ctrl + l :清屏
Ctrl + a :游標移到命令列首
Ctrl + e :游標移到命令列尾
Ctrl + u :從游標所在位置刪除到行首
Ctrl + z :發命令放入後臺執行
Ctrl + r :在命令歷史中搜尋

三、歷史命令

1. 命令格式

history [選項] [歷史命令儲存檔案]

2. 選項

-c 清空歷史命令
-w 把快取中的歷史命令寫入歷史命令儲存檔案 ~/bash_history

3. 歷史儲存條數

  • 歷史命令預設會儲存1000條,可以在環境變數配置檔案 ~/.bashrc 中進行修改
# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
HISTFILESIZE=2000

4. 歷史命令的呼叫

  • 使用上、下箭頭呼叫以前的歷史命令
  • 使用 !n 重複執行第n條歷史命令
  • 使用 !! 重複執行上一條命令
  • 使用 !字串 重複執行最後一條以該字串開頭的命令

四、輸出重定向

1. 標準輸入與輸出

裝置 裝置檔名 檔案描述符 型別
鍵盤 /dev/stdin 0 標準輸入
顯示器 /dev/stdout 1 標準輸出
顯示器 /dev/stderr 2 錯誤輸出

2. 輸出重定向

標準輸出重定向

  • 命令 > 檔案

以覆蓋的方式,把命令的正確輸出儲存到指定的檔案或裝置中。

  • 命令 >> 檔案

以追加的方式,把命令的正確輸出儲存到指定的檔案或裝置中。

錯誤輸出重定向

  • 錯誤命令 2> 檔案

以覆蓋的方式,把命令的錯誤輸出儲存到指定的檔案或裝置中。

  • 錯誤命令 2>> 檔案

以追加的方式,把命令的錯誤輸出儲存到指定的檔案或裝置中。

正確輸出與錯誤輸出同時儲存

  • 命令 > 檔案 2>&1

以覆蓋的方式,把命令的正確輸出和錯誤輸出都儲存到指定的檔案中。

  • 命令 >> 檔案 2>&1 (常用)

以追加的方式,把命令的正確輸出和錯誤輸出都儲存到指定的檔案中。

  • 命令 &> 檔案

以覆蓋的方式,把命令的正確輸出和錯誤輸出都儲存到指定的檔案中。

  • 命令 &>> 檔案 (常用)

以追加的方式,把命令的正確輸出和錯誤輸出都儲存到指定的檔案中。

  • 命令 >> 檔案1 2>> 檔案2 (常用)

把命令的正確輸出追加到檔案1中,把錯誤輸出追加到檔案2中。

# 將 shell.sh 執行的正確輸出儲存到 access.log 檔案,錯誤輸出儲存到 error.log 檔案
shell.sh >> access.log 2>> error.log

3. 輸入重定向

  • 命令 < 檔案

把檔案內容作為命令的輸入

# 在mysql中執行sql檔案中的語句
mysql -uroot -p < db.sql

# 統計 access.log 檔案的行數,單詞書,字元數
wc < access.log
  4  24 130
# 實際上該命令不加 < 也可以執行
wc access.log
  4  24 130 access.log
  • 命令 << 識別符號 ... 識別符號
命令 << 識別符號
...
識別符號

將兩個相同識別符號之間的內容作為命令的輸入。
類似PHP中的heredoc語法。

五、多命令順序執行

1. 多命令順序執行

多命令執行符 格式 作用
; 命令1 ; 命令2 多命令順序執行,命令之間沒有任何邏輯關係
&& 命令1 && 命令2 邏輯與
當命令1正確執行時,命令2才會執行
當命令1執行不正確時,命令2不會執行。
|| 命令1 || 命令2 邏輯或
當命令1正確執行不正確時,命令2才會執行
當命令1正確執行時,命令2不會執行。
# 根據兩次日期輸出的差值,計算中間壓縮命令執行的時間
date; tar -zcvf etc.tar.gz /etc; date

# 根據輸出 yes 還是 no,判斷第一條命令是否正確執行
ls && echo yes || echo no

2. 管道符

命令格式

命令1 | 命令2

將命令1的正確輸出作為命令2的操作物件

# 使用 less 命令檢視 /etc/ 下目錄或檔案資訊
ll /etc/ | less -mN

# 檢視當前建立連線的埠數量
netstat -an | grep ESTABLISHED | wc -l

# 去掉配置檔案中的註釋和空行,並生成一個新的配置檔案
cat /etc/redis/redis.conf | grep -v "#" | grep -v "^$" > /etc/redis/redis6379.conf

# 在/home目錄下查詢包含“max_children”的檔案
sudo find /home -type f -name `*` | xargs grep "max_children"

六、Shell中特殊符號

1. 萬用字元

萬用字元 作用
匹配一個任意字元
* 匹配0個或任意過個任意字元,也就是可以匹配任何內容
[] 匹配中括號中任意一個字元。例如:[abc]代表匹配a/b/c中的任意一個字元
[-] 匹配中括號中任意一個字元。- 代表一個範圍。例如:[a-z]代表匹配任意一個小寫字母
[^] 邏輯非,匹配不是中括號中任意一個字元。例如:[^0-9]代表匹配任意一個不是數字的字元
[vagrant/tmp] ]$ll
total 0
-rw-rw-r-- 1 vagrant vagrant 0 May  3 02:21 ab1
-rw-rw-r-- 1 vagrant vagrant 0 May  3 02:21 ab2
-rw-rw-r-- 1 vagrant vagrant 0 May  3 02:21 ab3
-rw-rw-r-- 1 vagrant vagrant 0 May  3 02:21 abc
-rw-rw-r-- 1 vagrant vagrant 0 May  3 02:21 abc.log
-rw-rw-r-- 1 vagrant vagrant 0 May  3 02:21 abd
-rw-rw-r-- 1 vagrant vagrant 0 May  3 02:21 abe
[vagrant/tmp] ]$ls abc
abc
[vagrant/tmp] ]$ls abc*
abc  abc.log
[vagrant/tmp] ]$ls ab?
ab1  ab2  ab3  abc  abd  abe
[vagrant/tmp] ]$ls ab[0-9]
ab1  ab2  ab3
[vagrant/tmp] ]$ls ab[0-9a-z]
ab1  ab2  ab3  abc  abd  abe
[vagrant/tmp] ]$ls ab[^a-z]
ab1  ab2  ab3

2. Bash中其他特殊符號

符號 作用
`` 單引號。
單引號中所有特殊符號,如 $ 和 ` (反引號) 都沒有特殊含義
"" 雙引號。
雙引號中特殊符號都沒有特殊含,但是 $ ` (反引號) 、和 是例外,分別擁有“呼叫變數的值”、“引用命令”、“轉義符”的特殊含義
`` 反引號。
反引號中的內容是系統命令,在Bash中會先執行它。
$() 和反引號作用一樣,用來引用系統命令。不過推薦使用$(),因為反引號非常容易看錯。
# 在Shell指令碼中,#開頭的行代表註釋
$ 用於呼叫變數的值,如需要呼叫變數name的值時,需要用$name的方式得到變數的值
轉義符。
跟在之後的特殊符號將失去特殊含義,變為普通字元。如$將輸出$符號,而不是當做變數引用

相關文章