1. 程式人生 > >2017-10-27Linux基礎知識(9)bash基礎特性

2017-10-27Linux基礎知識(9)bash基礎特性

linux 基礎

2017-10-27Linux基礎知識(9)bash基礎特性

在上一章當中我們講述了FHS、以及一些命令和bash命令歷史的特性,FHS是標準的文件系統層級結構,它規定的文件系統的分類存儲,使得讓各個Linux的發行版本得到的參考和統一,之後我們介紹了一些基本命令,例如:添加別名等,最後我們介紹了Linux文件系統的類型等,那我們接下來繼續介紹bash的基礎特性,還有一些其它命令。

一、命令補全

用戶在shell界面中(或者叫CLI界面中)輸入某個字符,解析為是否是內部命令還是外部命令,如果是外部命令,shell程序就會在指定的文件路徑下去查找用戶所鍵入字符相對應,如果字符與該目錄文件唯一,則可以用tab鍵補全,如果不唯一,按一下tab不會顯示什麽,不過第二下就會顯示相應的命令列表來給你進行參考,如果按兩下tab沒有用的話,即使你回車,shell就會提示你沒有這個命令。

那麽來總結一下,shell程序在接收用戶執行命令的請求,分析完成之後,最左側的字符串會被當成命令,而查找的處理機制分為兩類,如果是shell內部命令,就查找其shell的內部命令;如果是外部命令,就會根據PATH環境變量中設定的目錄,自左而右逐個搜索目錄下的文件名。
當你輸入某個命令是,如果是唯一的,按住一次tab就會進行補全,這是因為給定的打頭字符如果能唯一標識某命令的程序文件,則直接補全,不能唯一標識某命令的程序文件,則在擊tab鍵一次,給出相應的列表供你選擇。
所以命令補全是在給定的起始路徑下,以對應路徑下的打頭字符串逐一匹配起始路徑下的每個文件;如果能唯一標識,則直接補全,否則,再一次tab,給出列表。

1.1 目錄管理類的命令

首當其沖我們首先要講的是mkdir和rmdir這兩個命令,那麽顧名思義,就是創建和刪除目錄,在Windows中我們創建目錄的話,直接右鍵->新建->文件夾,在Linux中我們則使用mkdir命令在創建目錄,其命令格式為:

  # mkdir [OPTION]... DIRECTORY...

常用的選項有以下幾種:

  -p:自動按需創建父目錄;
  -v:verbose, 顯示詳細過程;
  -m MODE:直接給定權限;

需要註意的是:路徑的基名方為命令的作用對象;基名之前的路徑必須得存在;起始基名就是最後一個名稱。
接下來說的是刪除目錄命令,刪除目錄命令為rmdir,如果前提是該目錄是一個空目錄才能刪除,裏面要是有文件或目錄的話,我們可以批量刪除,命令的用法也是與創建目錄的用法相同:

  # rmdir [OPTION]... DIRECTORY...

選項如下:

  -p:刪除某個目錄後,如果其父目錄為空,並一並刪除之;
  -v:顯示過程;

現在有以下兩個問題:
1、如何創建/tmp/x/y1, /tmp/x/y2, /tmp/x/y1/a, /tmp/x/y1/b?
2、如何創建a_c, a_d, b_c, b_d?

二、命令行展開

命令行展開無非有一下幾類:一類是家目錄的,一類是{},之前我們也講過在命令提示符當中~代表著當前的家目錄或自動展開為用戶的家目錄,而{}是可承載一個以逗號的路徑列表,並能夠將其展開為多個路徑,以下可示例:

 例如:/tmp/{a,b},相當於:/tmp/a, /tmp/b

好的以上就是命令行的展開,那麽前兩題的答案如下:

  # mkdir -pv x/{y1/{a,b},y2}
  # mkdir -pv {a,b}_{c,d}

現在有個問題3:創建如下結構:

    /tmp/mysysroot/
	bin
	sbin
	etc
	    sysconfig
		network-scripts
	usr
	    bin
	    sbin
	    local
		bin
		sbin
		etc
		lib
	lib
            lib64
        var
	    cache
	    log
	    run

答案:

  # mkdir -pv /tmp/sysroot/{bin,sbin,etc/sysconfig/network-scripts,usr/{bin,sbin,local/{bin,sbin,etc,lib}},lib/lib64,var/{cache,log,run}}

我們可以用tree命令查看一下,需要註意的是,在Linux系統當中,可能是沒有這條命令,我們可以使用yum命令安裝,至於yum命令的用法,我們隨後講系統管理時再次說明。

  # yum -y install tree

命令用法:

  # tree [options] [directory]
	-L level:指定要顯示的層級;
  # tree /tmp/sysroot/
  /tmp/sysroot/
  |-- bin
  |-- etc
  |   `-- sysconfig
  |       `-- network-scripts
  |-- lib
  |   `-- lib64
  |-- sbin
  |-- usr
  |   |-- bin
  |   |-- local
  |   |   |-- bin
  |   |   |-- etc
  |   |   |-- lib
  |   |   `-- sbin
  |   `-- sbin
  `-- var
      |-- cache
      |-- log
      `-- run

  19 directories, 0 files

三、命令的執行狀態結果

我們在shell當中輸入某個命令時,如果執行對了就會顯示其相應的結果,命令輸錯也有相應的提示,而每個命令的結果其實都有它的返回值的,其結果也無非是正確和錯誤,那麽bash就是通過執行狀態的返回值來輸出此結果,成功就是0,失敗的範圍數很大,從1到255,當你的命令執行完成之後,其狀態返回值保存於bash的特殊變量$?中。

  # ls
  anaconda-ks.cfg  fstab  functions  lover.txt  shell_scripts
  # echo "$?"
  0
  # lss
  -bash: lss: command not found
  # $?
  -bash: 127: command not found

還有,當命令正常執行時,有的還回命令結果的返回值;根據命令及其功能的不同,結果也各不相同。
我們還可以引用命令的執行結果,有以下兩種方式:

  $(COMMAND)或`COMMAND`
  # mkdir `date +"%F_%T"`
  # ll
  drwxr-xr-x. 2 root root     6 Oct 29 11:13 2017-10-29_11:13:15

四、引用

我們可使用單引號和雙引號來引用變量和語句等,差別就是一個是強引用,後者為弱引用,強引用是無論你是不是變量,都給你原樣顯示,不顯示變量結果,只顯示變量名稱,弱引用與強引用不同的是,弱引用是能顯示變量結果的,示例如下:

  # echo ‘$PATH‘
  $PATH
  # echo "$PATH"
  /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

還有一種是命令引用,這個在上面我們講過,此處略。

五、快捷鍵

我們在Windows中會知道各種各樣的快捷鍵,最簡單的也無非就是復制(Ctrl+c)和粘貼(Ctrl+v)了,在Linux也有其相應的快捷鍵,我們使用快捷鍵可以更好的處理Linux上的命令:

  Ctrl+a:跳轉至命令行行首;
  Ctrl+e:跳轉至命令行行尾;
  Ctrl+u:刪除行首光標所在處之間的所有字符;
  Ctrl+k:刪除光標所在處至行尾的所有字符;
  Ctrl+l:清屏,相當於clear;

5.1 文件查看類命令

我們之前講過文件查看類的命令,cat和tac前者是正序,後者是倒序查看,這是兩個基本的命令,但是這兩個命令直接就顯示到底部,並沒有一個查看過程,所以more命令和less命令就是將這個查看過程給顯示出來,這兩個的命令格式也是很簡單的:

  # more FILE

more命令有個特點:翻屏至文件尾部之後會自動退出;

  # less FILE

另一個文件查看類命令為head和tail,不一樣的是前者的命令查看前n行,而後者的命令查看倒數n行,格式如下:

  # head [options] FILE

選項:

  -n # 
  -#

head默認不加選項的話,只是顯示前10行默認,tail命令也是,顯示為後10行;

  # tail [options] FILE

選項:

  -n #
  -#
  -f:查看文件尾部內容結束後不退出,跟隨顯示新增的行;

接下來說一下stat命令,stat命令無疑是顯示文件或文件系統狀態,命令格式為

  # stat FILE...

如果查看某個文件狀態,就會看到一下結果,我們舉例來演示一下:

  # stat anaconda-ks.cfg 
    File: ‘anaconda-ks.cfg’
    Size: 1612      	Blocks: 8          IO Block: 4096   regular file
  Device: 803h/2051d	Inode: 50824939    Links: 1
  Access: (0600/-rw-------)  Uid: (    0/    root)   Gid: (    0/    root)
  Context: system_u:object_r:admin_home_t:s0
  Access: 2017-10-03 22:18:51.777786103 +0800
  Modify: 2017-10-03 22:18:51.794786340 +0800
  Change: 2017-10-03 22:18:51.794786340 +0800

我們主要講的是倒數後三行,前幾行我們很容易理解。如上所示,會出現三個類型的時間,分別是訪問時間、修改時間和更改時間。

  Access time:表示最後一次訪問(僅僅是訪問,沒有改動)文件的時間;
  Modify time:最後一次修改文件的時間;
  Change time:最後一次文件屬性修改的時間,包括權限、大小、屬性等;

5.2 文件管理工具

有文件查看工具就有它的管理工具,例如我們復制、移動和刪除都是用來管理文件的命令,首先我們說一下復制命令,復制命令的過程很簡單,將文件的數據流通過管道傳送到一個新的文件中去,原文件保留,移動也就將源文件刪除,而數據流則保留到了新的文件中,刪除就是將數據從磁盤上移除,但是並不代表磁盤塊中沒有數據,當新的數據寫入時,則那些磁盤塊就會自動替換,而塊中的源數據則不會在保留;現在我們說一下cp命令。
cp命令無非就是復制命令,從源文件產生目標文件的一個過程,有單源復制和多源復制這兩大選項,命令格式為:

  單源復制:# cp [OPTIONS]... [-T] SOURCE REST
  多源復制:# cp [OPTIONS]... SOURCE... DIRECTORY
	  # cp [OPTIONS]... -t DIRECTORY SOURCE...

我們先來說一下單源復制,單源復制:如果DEST不存在:則事先創建此文件,並復制源文件的數據流至DEST中,但如果DEST存在,那就得往兩方面考慮,一種是如果DEST是非目錄文件:則覆蓋其目標文件;另一種是如果DEST是目錄文件:則現在DEST目錄下先創建一個與源文件同名的文件,並復制其數據流。

  單源復制:# cp [OPTIONS]... [-T] SOURCE REST

另一種是多源復制,就是將多個文件復制到一個地方去,如果說DEST不存在有兩個選項,第一個就是如果DEST是非目錄文件:則直接錯誤;但如果DEST是目錄文件:則分別復制每個文件至目標目錄中,並保持原名。
cp的常用選項如下:

  -i:交互式復制,即覆蓋之前提醒用戶確認;
  -f:強制覆蓋目標文件;
  -r:遞歸復制目錄;
  -d:復制符號鏈接本身,而非指向其源文件;
  -a: ---preserve=all, archive, 用於實現歸檔;
  --preserv=
	mode:權限
	ownership:屬主和屬組
	timestamps:時間戳
	context:安全標簽
	xattr:擴展屬性
	links:符號鏈接
	all:上述所有屬性

那麽關於移動的命令為mv命令,使用命令的格式也是和cp命令差不多,大致格式為:

 mv [OPTION]... [-T] SOURCE DEST
 mv [OPTION]... SOURCE... DIRECTORY
 mv [OPTION]... -t DIRECTORY SOURCE...

常用選項:

  -i:交互式;
  -f:force

接下來就是刪除命令了,rm命令就是清除命令,這個命令是非常危險的,弄不好的話可以將系統刪除,簡直就是灰飛煙滅,而且這個刪除命令,是不可逆操作的,請慎用這個命令,其命令格式如下:

  # rm [OPTIONS]... FILE...

常用選項:

  -i:interactive
  -f:force
  -r:recursive

如果你想強制刪除某個目錄,就用以下格式:

  # rm -rf /PATH/TO/DIR

其中最危險的操作:

  # rm -rf /*

危險的命令推薦使用一下,體驗它的嚴重性,這樣保證在生產環境中就會謹慎。需要註意的是:所有不用的文件建議不要直接刪除,而是移動某個專用目錄。(模擬回收站)

六、變量

變量其實是一個很大的話題,這裏就簡單說一下,變量就是在內存當中申請一塊空間用來存放數據,用變量名稱來標識其該變量的內存地址,命名的內存空間;變量類型有很多,大致分為字符型、數值型等,我們以字符型為例,分為精確數值和近似數值。使用變量我們一定要考慮它的存儲格式、數據範圍和參與運算的性質,那麽變量的復制操作為:name=var。

本文出自 “天蠍座” 博客,轉載請與作者聯系!

2017-10-27Linux基礎知識(9)bash基礎特性