首頁 > 軟體

Linux之bash shell特性

2020-06-16 17:22:03

一、shell是什麼?

Shell 本身是一個用C語言編寫的程式,它是使用者使用Unix/Linux的橋樑,使用者的大部分工作都是通過Shell完成的。Shell既是一種命令語言,又是一種程式設計語言。作為命令語言,它互動式地解釋和執行使用者輸入的命令;作為程式設計語言,它定義了各種變數和引數,並提供了許多在高階語言中才具有的控制結構,包括迴圈和分支。

如圖shell是一個應用程式,是使用者管理應用程式的一個介面。

二、廣義上shell的分類

GUI:圖形化使用者介面

KDE,GNOME,XFCE

CLI:命令列介面

bash, zsh, fishsh, csh, tcsh, ksh

在大多發行版中常用的為bash

三、bash的特性

bash是弱型別的程式語言,不嚴格區分資料型別,意味把所有資料統統當作字串處理;

字串型別的資料可不加引號;

引號有三種型別:', ", `

', ":字元參照

': 強參照,其內部的變數不會被替換;

":弱參照,其內部的變數會被替換;

`:命令參照

變數參照:${NAME}

a、bash特性之一:快捷鍵

ctrl + ? 撤消前一次輸入
ctrl + c 另起一行
ctrl + r 輸入單詞搜尋歷史命令

刪除
ctrl + d 刪除游標所在位置上的字元相當於VIM裡x或者dl
ctrl + h 刪除游標所在位置前的字元相當於VIM裡hx或者dh
ctrl + k 刪除游標後面所有字元相當於VIM裡d shift+$
ctrl + u 刪除游標前面所有字元相當於VIM裡d shift+^
ctrl + w 刪除游標前一個單詞相當於VIM裡db
ctrl + y 恢復ctrl+u上次執行時刪除的字元
ctrl + ? 撤消前一次輸入
alt + r 撤消前一次動作
alt + d 刪除游標所在位置的後單詞

移動
ctrl + a 將游標移動到命令列開頭相當於VIM裡shift+^
ctrl + e 將游標移動到命令列結尾處相當於VIM裡shift+$
ctrl + f 游標向後移動一個字元相當於VIM裡l
ctrl + b 游標向前移動一個字元相當於VIM裡h
ctrl + 方向鍵左鍵 游標移動到前一個單詞開頭
ctrl + 方向鍵右鍵 游標移動到後一個單詞結尾
ctrl + x 在上次游標所在字元和當前游標所在字元之間跳轉
alt + f 跳到游標所在位置單詞尾部

替換
ctrl + t 將游標當前字元與前面一個字元替換
alt + t 交換兩個游標當前所處位置單詞和游標前一個單詞
alt + u 把游標當前位置單詞變為大寫
alt + l 把游標當前位置單詞變為小寫
alt + c 把游標當前位置單詞頭一個字母變為大寫
^oldstr^newstr 替換前一次命令中字串

歷史命令編輯
ctrl + p 返回上一次輸入命令字元
ctrl + r 輸入單詞搜尋歷史命令
alt + p 輸入字元查詢與字元相接近的歷史命令
alt + > 返回上一次執行命令

其它
ctrl + s 鎖住終端
ctrl + q 解鎖終端
ctrl + l 清屏相當於命令clear
ctrl + c 中止當前命令
ctrl + d 後台執行(等同於命令後面接&)
ctrl + i 類似TAB健補全功能
ctrl + o 重複執行命令
alt + 數位鍵 操作的次數
Esc-b 左移一個單詞
Esc-f 右移一個單詞
ctrl+s : 鎖住螢幕 
ctrl+q : 恢復螢幕

b、bash的特性之二:命令歷史

shell進程會儲存其對談中使用者曾經執行過的命令;命令通過其“歷史檔案”來持久儲存此前執行過的命令;每個使用者都有其自己專用的歷史檔案;

HISTSIZE:shell進程的緩衝區保留的歷史命令的條數;

HISTFILESIZE:命令歷史檔案可儲存的歷史命令的條數;

HOSTTIMEFORMAT:歷史命令加時間戳,用於審計;

HISTIGNORE="str1:str2:…"忽略string1,string2歷史;

#export HISTTIMEFORMAT="%F %T"
...
  358  2016-12-28 04:12:34 man split
  359  2016-12-28 04:14:29 cd
  360  2016-12-28 04:14:34 vim .bash_history 
  361  2016-12-28 04:22:39 history

預設均為1000;

# echo $HISTSIZE
1000
# echo $HISTFILESIZE
1000

HISTFILE:當前使用者的命令歷史檔案;

~/.bash_history

檢視命令歷史列表:

# history

命令用法:

history -c:清空命令歷史;

history -d OFFSET:刪除指定的條目;

# history -d 156

-a:將當前緩衝的歷史行追加到歷史檔案中

-n:從歷史檔案中讀取所有未被讀取的行

-r:讀取歷史檔案並將內容追加到歷史列表中

-w:儲存歷史列表到指定的歷史檔案

-s: 展開歷史引數成一行,附加在歷史列表後(偽造歷史命令)

呼叫命令歷史列表中的命令以重執行之目的:

!#:再一次執行歷史列表中的第#條命令;

# history
   ....
   72  cat test 
   73  history 
# !72
cat test 
Hello World

!!:再一次執行上一條命令;

# cat test 
Hello World
# !!
cat test 
Hello World

!STRING:再一次執行命令歷史列表中最近一個以指定的STRING開頭的命令;

# !cat
cat test 
Hello World

顯示最近的n條件命令歷史:

history  #

控制命令歷史的記錄方式:

通過HISTCONTROL環境變數進行,其取值:

ignoredups:忽略重複的命令;重複是指連續且相同的令;

ignorespace:以空白字元開頭的命令不記入歷史;

ignoreboth:上述兩者同時生效;

erasedups:刪除重複命令;

修改變數值的方式:

NAME='VALUE'

# echo $HISTCONTROL
ignoredups
# HISTCONTROL="ignoreboth"
# echo $HISTCONTROL
ignoreboth

永久生效存放位置:

存放在 /etc/profile 或 ~/.bash_profile或/etc/profile.d/*.sh

歷史命令引數呼叫:

呼叫上一條命令的最後一個引數:

快捷鍵:ESC, .

Alt+.

!$:給出的字元組合

#cmd !^ : 利用上一個命令的第一個引數做cmd的引數

#cmd !$ : 利用上一個命令的最後一個引數做cmd的引數

#cmd !* : 利用上一個命令的全部引數做cmd的引數

#cmd !:n : 利用上一個命令的第n個引數做cmd的引數

 !n:^ 呼叫第n條命令的第一個引數

 !n:$ 呼叫第n條命令的最後一個引數

 !m:n 呼叫第m條命令的第n個引數

 !n:* 呼叫第n條命令的所有引數

!string:^ 從命令歷史中搜尋以 string 開頭的命令,並獲取
它的第一個引數

!string:$ 從命令歷史中搜尋以 string 開頭的命令,並獲取它
的最後一個引數

!string:n 從命令歷史中搜尋以 string 開頭的命令,並獲取
它的第n個引數

!string:* 從命令歷史中搜尋以 string 開頭的命令,並獲取
它的所有引數

c、bash的特性之三:內外部命令和命令路徑補全

命令補全:

shell程式在接收到使用者執行命令的請求且分析完成之後,最左側字串將被當作命令去查詢;

查詢機制:

(1) 查詢內部命令;

(2) 查詢快取在記憶體中的外部命令;

(3) 查詢外部命令:

1、去$PATH變數所指定的各路徑下,自左而右逐個搜尋各目錄下的檔名;

2、給定的打頭的字串如果能惟一標識某命令程式檔案的檔名,則直接補全;

3、不能惟一標識,再擊tab可給列表;

4、錯誤:沒有任何命令可被此打頭字串標識;

type命令用來檢視內部外部命令

enable命令:

#enable -n cd 禁用內部命令
#enable cd 啟用內部命令

使用which或者where檢視命令所在的路徑

hash命令:

搜尋到的外部命令路徑結果快取至kv(key-value)儲存中

hash 顯示hash快取 hash –r 清除快取,hash -d COMMAND 清空制定的命令

#which --skip-alias cd
/usr/bin/cd

路徑補全:

在給定的起始路徑的上級目錄下,以對應路徑下的打頭字串來逐一匹配上級目標下的每個檔案:

惟一標識:tab補全;

不能惟一標識:tab, tab給出列表;

錯誤路徑:沒有響應;

更多詳情見請繼續閱讀下一頁的精彩內容http://www.linuxidc.com/Linux/2017-02/140320p2.htm


IT145.com E-mail:sddin#qq.com