Bash 的基本功能
一、命令別名
1. 命令生效的順序
- 執行使用絕對路徑或相對路徑執行的命令
- 執行別名
- 執行Bash內部命令
- 執行按照
$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的方式得到變數的值 |
|
轉義符。 跟在 之後的特殊符號將失去特殊含義,變為普通字元。如$ 將輸出$ 符號,而不是當做變數引用 |