歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> SHELL編程

Linux之bash shell特性

一、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給出列表;

錯誤路徑:沒有響應;

Copyright © Linux教程網 All Rights Reserved