1. 程式人生 > >SHELL基本知識及常用命令

SHELL基本知識及常用命令

一、shell基本知識

1. 什麼是shell
  • shell
    shell也是作業系統中的一個軟體,它包在 linux 核心的外面,為使用者和核心之間的互動提供了一個介面,系統中的命令用 shell 去解釋 shell 接收系統迴應的輸出並顯示其到螢幕上;
    可以將 Shell 終端直譯器當作人與計算機硬體之間的“翻譯官”它作為使用者與 Linux 系統內部的通訊媒介,除了能夠支援各種變數與引數外,還提供了諸如迴圈、分支等高階程式語言才有的控制結構特性。
  • shell 指令碼
    指令碼是一種解釋型語言
    用shell指令碼儲存執行動作
    用指令碼判定命令的執行條件
    用指令碼來實現動作的批量執行
    shell script (程式化指令碼) 是利用 shell 的功能所寫的一個“程式 (program)”,這個程式是使用純文字檔案,將一些 shell 的語法與指令(含外部指令)寫在裡面, 搭配正則表示式、管線命令與資料流重導向等功能,以達到我們所想要的處理目的。
2. shell指令碼格式
  • shell 指令碼的格式
    Shell 指令碼檔案的名稱可以任意,但為了避免被誤以為是普通檔案,建議將 .sh 字尾加上,以表示是一個指令碼檔案。
    shell 指令碼中一般會出現三種不同的元素:
    第一行的指令碼宣告(#!)用來告訴系統使用哪種 Shell 直譯器來執行該指令碼;
    第二行的註釋資訊(#)是對指令碼功能和某些命令的介紹資訊,使得自己或他人在日後看到這個指令碼內容時,可以快速知道該指令碼的作用或一些警告資訊;
    第三、四行的可執行語句也就是我們平時執行的 Linux 命令了。
指令碼宣告和註釋資訊系統自動新增方式

編輯 /root/.vimrc 或 在/etc/vimrc 中加入如下內容:

autocmd BufNewFile *.sh exec ":call SetComment_sh()"
// 表示當通過 vim 編輯任何以 .sh 結尾的檔案時,都會在檔案開頭實現對如下 Bleach() 內容的呼叫
func SetComment_sh()
        call setline(1,"#!/bin/bash")
    call setline(2,"")
    call setline(3, "#================================================================"
) call setline(4, "# Copyright (C) ".strftime("%Y")." Sangfor Ltd. All rights reserved.") call setline(5, "# ") call setline(6, "# 檔名稱:".expand("%:t")) call setline(7, "# 創 建 者:Sunshine") call setline(8, "# 建立日期:".strftime("%Y年%m月%d日")) call setline(9, "# 描 述:") call setline(10, "#") call setline(11, "#================================================================") call setline(12, "") call setline(13, "") endfunc

退出儲存後,編輯任意以.sh結尾的檔案,自動新增如下內容:
這裡寫圖片描述

3. 指令碼的除錯
sh -x scritps.sh        適用於所有shell指令碼
vim scripts.sh      shell指令碼必須有X許可權
#!/bin/bash -x
4. 指令碼的執行
  • sh script.sh
  • source script.sh
  • . script.sh
  • chmod +x script.sh
  • ./script.sh

二、shell指令碼常用命令

1. diff
  • diff是用在比對兩個檔案之間的差異的,並且是以行為單位來比對的。一般是用在 ASCII 純文字檔案的比對上。由於是以行為比對的單位,因此 diff 通常是用在同一檔案(或軟體)的新舊版本差異上對比上,能夠藉由 diff 建立的分析檔,以處理補丁(patch)功能的檔案
[root@sunshine ~]# diff  將兩個檔案或目錄的內容進行比較
   -b:忽略一行當中,僅有多個空白的差異(例如"about me""about    me"視為相同
   -B:忽略空白行的差異。
   -i:忽略大小寫的不同。
   -u:顯示檔案資訊的不同
 顯示內容的含義
 [num1,num2][a|b|c][num3,num4]
 num1,num2    #表示在第一個檔案中的行數
 num3,num4    #表示在第二個檔案中的行數
 a             #表示新增---add
 c             #表示更改---change
 d             #表示刪除---delete
 <             #表示第一個檔案中的內容,
 >             #表示第二個檔案中的內容
 ---           #分割線
 如新建兩個檔案 test1 test2
 test1 內容為:第一行 hello;第二行 linux
 test2 內容為:第一行 hello;第二行 unix
 用 diff 比較兩檔案內容的不同
 [root@sunshine shell]# diff test1 test2  #比較檔案內容的不同
 2c2            #左邊檔案的第二行被取代(c)成右邊檔案的第二行,兩個檔案內容就會相同
 < linux        #左邊檔案第二行內容
 ---            #分割線
 > unix         #右邊檔案第二行內容
 [root@sunshine shell]# diff -u test1 test2
 --- test1  2018-06-25 11:42:01.054285062 +0800
     #test1 test2 檔案的資訊
 +++ test2  2018-06-25 11:42:14.494316842 +0800
 @@ -1,2 +1,2 @@     
 #新舊檔案要修改資料的界定範圍,舊檔案在 1-2 行,新檔案在 1-2 行
  hello    
 -linux      #刪除linux
 +unix       #加上unix

實操如下:
這裡寫圖片描述

diff還可以用來比較目錄
 [root@sunshine shell]# diff -r /etc/rc0.d/ /etc/rc5.d/
                  # -r:遞迴地比較找到的任何子目錄
 Only in /etc/rc0.d/: K03rhnsd       #此檔案只在/etc/rc0.d 中有          
 Only in /etc/rc0.d/: K90network
 Only in /etc/rc5.d/: S10network     #此檔案只在/etc/rc5.d 中有
 Only in /etc/rc5.d/: S97rhnsd
 這樣就比較出了兩目錄內容的不同

具體比較過程如下:
這裡寫圖片描述

2. patch
  • patch
    這個指令常與 diff 配合使用,diff 可以用來分辨兩個版本之間的差異,舉例來說上述我們所建立的 test1 及 test2 之間就是兩個不同版本的檔案。如果要“升級”呢?就是“將舊的檔案升級成為新的檔案”時,應該要怎麼做?就是“先比較先舊版本的差異,並將差異檔製作成為補丁檔案,再由補丁檔案更新舊檔案”即可。也就是我們俗稱的打補丁
 [root@sunshine ~]# yum install patch -y  #首先安裝 patch
 [root@sunshine ~]# patch
  -p :後面可以接“取消幾層目錄”的意思。
  -R :代表還原,將新的檔案還原成原來舊的版本
  -b :備份檔案。在修補檔案時,重新命名或複製原始檔案,而不是刪除它
 [root@sunshine shell]# diff -u test1 test2 > test.patch
                  #生成補丁檔案 test.patch 
 [root@sunshine shell]# patch -b test1 test.patch
 patching file test1          #修補檔案test1

具體實踐過程如下:
首先生成補丁檔案
這裡寫圖片描述
對檔案進行修補,-b 儲存原始檔,可看到生成了 .orig 原始檔,
這裡寫圖片描述

3. cut

cut 命令用於按“列”提取文字字元,格式為“cut [引數] 文字”

 [[email protected] ~]# cut -d '分隔字元' -f 設定需要看的列數
 [[email protected] ~]# cut -c 字元區間用於排列整齊的訊息
 選項與引數:
 -d :後面接分隔字元。與 -f 一起使用;
 -f :依據 -d 的分隔字元將一段訊息分割槽成為數段,用 -f 取出第幾段的意思;
 -c :以字元 (characters) 的單位取出固定字元區間;
 示例:擷取主機的 ip 地址
 [[email protected] ~]# ifconfig | head -n 2 | tail -n 1 | cut -d " " -f 10
 #擷取主機的 ip 地址,以‘空格’為分隔符,擷取第 10 列

這裡寫圖片描述

4. &&, ||
  • &&
    在 Shell 終端中邏這裡寫程式碼片輯“與”的運算子號是&&,它表示當前面的命令執行成功後才會執行它後面的命令
  • ||
    在 Shell 終端中邏輯“或”的運算子號是 ||,表示當前面的命令執行失敗後才會執行它後面的命令

示例如下:

編寫指令碼,檢視當前的網路狀態。當ping命令可以ping通時,即顯示對應的網路狀態is up, 否則為down.
指令碼內容如下:
#!/bin/bash
ping -c1 -w1 $1 && {
    echo $1 is up
} || {
    echo $1 is down
}

實操如下:
這裡寫圖片描述

5. sort
多用於字元排序
 [[email protected]  ~]$ sort [選項] [file or stdin]
 選項與引數:
 -f :忽略大小寫的差異,例如 A 與 a 視為編碼相同; 
 -b :忽略最前面的空白字元部分;
 -M :以月份的名字來排序,例如 JAN,DEC 等等的排序方法;
 -n :使用“純數字”進行排序(預設是以文字型態來排序的);
 -r :反向排序;
 -u :就是 uniq,相同的資料中,僅出現一行代表;
 -t :分隔符號,預設是用 [tab] 鍵來分隔;
 -k :以那個區間 (field) 來進行排序的意思
  [[email protected] ~]# sort -nt ":" -k 3 /mnt/passwd
 以數字排序方式,以“:”為分隔符,對 /etc/passwd 的第三列內容進行排序
6. uniq 對重複字元作相應處理,一般與排序進行連用
 [[email protected] ~]# uniq 
   -u 顯示唯一的以行
   -d 顯示重複的行
   -c 每行顯示一次並統計重複次數

示例如下:
編輯建立 /tmp/shell/uniqtest 檔案
這裡寫圖片描述
通過uniq進行操作:
這裡寫圖片描述

7. test

Shell中的 test 命令用於檢查某個條件是否成立,它可以進行數值、字元和檔案三個方面的測試。

test 命令和 [ ] 等同
[ "a" == "b"] 等同於 test a = b  

1)判定字串的資料

判定方式 含義
test -z string 判定字串是否為 0 若 string 為空字串,則為 true
test -n string 判定字串是否非為 0 若 string 為空字串,則為 false -n 亦可省略
test str1 == str2 判定 str1 是否等於 str2 ,若相等,則回傳 true
test str1 != str2 判定 str1 是否不等於 str2 ,若相等,則回傳 false

判定字串是否為空
這裡寫圖片描述
對字串進行比較
這裡寫圖片描述

2)多重條件判定,例如: test -r filename -a -x filename
判定方式 含義
-a (and)兩狀況同時成立!例如 test -r file -a -x file則 file 同時具有 r 與 x 許可權時,才回傳 true。
-o (or)兩狀況任何一個成立!例如 test -r file -o -x file,則 file 具有 r 或 x 許可權時,就可回傳 true。
3)關於兩個整數之間的判定,例如 test n1 -eq n2
判定方式 含義
-eq 兩數值相等 (equal)
-ne 兩數值不等 (not equal)
-gt n1 大於 n2 (greater than)
-lt n1 小於 n2 (less than)
-ge n1 大於等於 n2 (greater than or equal)
-le n1 小於等於 n2 (less than or equal)
 示例:編輯指令碼,將輸入的數字與 10 比較,若在 1-10 之間
 輸出:num is between 1 - 10
 否則輸出:num is not between 1 - 10
 指令碼內容如下:
  #!/bin/bash
 [ -z  "$1" ] && {                 #判斷輸入是否為空,若為空,則輸出如下         echo "Please input a number after scripts."
         exit 1
 }
 [ "$1" -gt "0" -a "$1" -lt "10" ] && {   #若輸入大於 0 小於 10 ,輸出如echo "$1" is between 1 - 10
 } || {     
         echo "$1" is not between 1 - 10  #否則輸出如左所示
 }

執行如下:
這裡寫圖片描述
4)兩個檔案之間的比較,如:test file1 -nt file2

判定方式 含義
-nt (newer than)判斷 file1 是否比 file2 新
-ot (older than)判斷 file1 是否比 file2 舊
-ef 判斷 file1 與 file2 是否為同一檔案,可用在判斷hard link(硬連結) 的判定上。主要意義在判定,兩個檔案是否均指向同一個 inode

5)關於某個檔名的“檔案型別”判斷,如 test -e filename 表示存在否

判定方式 含義
-e 該“檔名”是否存在
-f 該“檔名”是否存在且為檔案(file)
-d 該“檔名”是否存在且為目錄(directory)
-b 該“檔名”是否存在且為一個 塊裝置(block device) 裝置
-c 該“檔名”是否存在且為一個 字串(character device) 裝置
-S 該“檔名”是否存在且為一個 套接子(Socket) 檔案
-L 該“檔名”是否存在且為一個 連結(軟連結)檔案
  1 #!/bin/bash
  2 [ -z "$1" ] && {       #判斷輸入是否為空,若為空,則輸出如下
  3         echo "Please input the file name after script"
  4         exit 1
  5 }
  6 [ -e "$1" ] || {       #判斷檔案是否存在
  7         echo "$1" is not exist!!
  8 }
  9 [ -L "$1" ] && {       #判斷檔案是否是連線
 10         echo "$1" is a link
 11         exit 0
 12 }
 13 [ -f "$1" ] && {       #判斷檔案是否為普通檔案
 14         echo "$1" is a regular file
 15 }
 16 [ -d "$1" ] && {       #判斷檔案是否目錄
 17         echo "$1" is a directory
 18 }
 19 [ -b "$1" ] && {       #判斷檔案是否為裝置檔案系統
 20         echo "$1" is a block special
 21 }
 22 [ -c "$1" ] && {       #判斷檔案是否為字元裝置
 23         echo "$1" is a character special
 24 }
 25 [ -S "$1" ] && {       #判斷檔案是否為套接字
 26         echo "$1" is a socket
 27 }

測試如下:
這裡寫圖片描述

8. tr

tr 可以用來刪除一段訊息當中的文字,或者是進行文字訊息的替換

 示例一:將 w 輸出的訊息中,所有的小寫變成大寫字元:
 [[email protected] ~]# w | tr 'a-z' 'A-Z'

執行如下:
這裡寫圖片描述

示例二:編寫指令碼,當
 編寫指令碼將輸入的單詞與 HELLO 進行比較,若為 小寫字元的 hello 將輸出 yes 否則輸出no
 其中若輸入的為大寫字元,將大寫字元轉化為小寫字元

#!/bin/bash
WORD=`echo $1`
if [ "$WORD" = "hello" ]; then     #將輸入的單詞與 hello 比較
    echo yes                       #若相同,輸出 yes
elif [ "$WORD" = 'HELLO' ]; then   #將輸入的單詞與 HELLO 比較
    echo no                        #若相同,輸出no
    echo $WORD | tr 'A-Z' 'a-z'    #將大寫轉換為小寫後輸出
else                         
    echo no                            
fi

執行結果如下:
這裡寫圖片描述

相關推薦

SHELL基本知識常用命令

一、shell基本知識 1. 什麼是shell shell shell也是作業系統中的一個軟體,它包在 linux 核心的外面,為使用者和核心之間的互動提供了一個介面,系統中的命令用 shell 去解釋 shell 接收系統迴應的輸出並

lvm基本知識常用命令

pv vg lv linux lvm lvm基礎知識: lvm是Logical Volume Manager(邏輯卷管理)的縮寫,可以理解為一種硬盤分區管理工具,有以下幾個重要的基礎術語:物理卷(Pyhsical Volume,PV):是由系統的基礎存儲設備,如/dev/sda,/d

Windows PowerShell基本語法常用命令

PowerShell常用命令: 一 Get類 1.Get-Command : 得到所有PowerShell命令,獲取有關 cmdlet 以及有關 Windows PowerShell 命令的其他元素的基本資訊。        &nbs

Linux下KVM虛擬機器基本管理常用命令

  說明:可能有重複 一、KVM的基本管理 1、檢視KVM虛擬機器配置檔案 #Kvm虛擬機器預設配置檔案位置 [[email protected] qemu]# pwd /etc/libvirt/qemu [[email protected] qe

必須要會的Git基本使用常用命令操作

之前一直用的svn,後來換了之後才發現git的強大功能,是svn不能比的。缺點就是可能上手比較難一點,剛開始自己研究了兩天才摸索出來一些基本使用方法。 最近做專案需要建庫等等,都用到了git,隨著越來越多的使用,也越來有越多的認識。 一開始都是別人建好遠端庫,克隆下來就行了。 下面

資料庫學習的一些基礎知識常用命令(部分)

【資料庫基本概念】 一個表只能有一個主鍵(primary key),主鍵列不允許為空值(null) 一個表中可以有多個列作為主鍵列,但需要考慮最少性和穩定性 外來鍵(foreign key):確保“從表”中的某個資料項在“主表”中必須存在 【基本術語】 D

Linux基礎知識常用命令

基礎知識點:1、描述計算機的組成及其功能。2、按系列羅列Linux的發行版,並描述不同發行版之間的聯絡與區別。3、描述Linux的哲學思想,並按照自己的理解對其進行解釋性描述。4、說明Linux系統上命令的使用格式;詳細介紹ifconfig、echo、tty、startx、export、pwd、hist

Windows PowerShell 基本語法常用命令

PowerShell常用命令: 一 Get類 1.Get-Command : 得到所有PowerShell命令,獲取有關 cmdlet 以及有關 Windows PowerShell 命令的其他元素的基本資訊。                            

Linux入門-基礎知識常用命令

Linux是一款開源的作業系統核心,基於Linux核心,加上shell和各類工具軟體,就組成了我們常說的:“Linux作業系統”。什麼是shellshell俗稱殼,是提供給我們使用介面(命令解析器),並且保護系統核心不被篡改的軟體。我們所有的指令都是通過shell傳達給lin

linux shell基本知識 sleep命令

cnblogs log style ash 基本 code bsp 知識 linux中 在有的shell(比如linux中的bash)中sleep還支持睡眠(分,小時) sleep 1 睡眠1秒 sleep 1s 睡眠1秒 sleep 1m 睡眠1

redis學習筆記01 — 基本介紹、安裝配置常用命令

redis——NoSQL的一種 為了解決高併發、高可用、高擴充套件、大資料儲存等一系列問題而產生的資料庫解決方案,就是NoSQL NoSQL,非關係型資料庫,全名:Not Only Sql,它不能代替關係型資料庫,只能作為關係型資料庫的一個良好補充。 redis 簡介 是使用

SQL Server知識總結常用命令

1、獲得表或者資料庫的ddl 有的時候想把某個表的ddl匯出,方法如下:選中表,點選右鍵,選擇“Script Table as”-》“Create To”,選中檔案或者剪貼簿,當然還有一些別的選項。 如果想把一個數據庫裡的表都匯出,有一個便利的方法: Right-cli

MySQL基本知識練習(5)

ase part exist 四舍五入 tex sub pass center 不同的 1.求一個班級數學平均分。 (1). select sum(math) / count(math) as 數學平均分 from student; (2). select avg(

JAVA異常基本知識異常在Spring框架中的整體解決方案

我們 程序 details 編譯錯誤 htm 及其 arch extends exception 異常的頂級父類是Throwable,下面有兩個子類Exception和Error。 Error錯誤一般是虛擬機相關的問題,如系統崩潰,虛擬機錯誤等,應用程序無法處理,直接導致

Git使用:安裝,使用常用命令整理

reset short 配置文件 res 命名 nbsp class 名詞 如果 對於程序猿而言,git是最常接觸的工具之一,因此需要熟練快速掌握其技巧。 git安裝: windwos: 【原創】Windows平臺下Git的安裝與配置 Ubuntu:git與github在

DAY-8 Linux基礎常用命令(4)

打開 ip地址 grep 軟件包 linux基礎 tro mks 官網 vim 一、制作swap分區(命令) swapon –s 查看當前激活狀態的swap分區 free –m 以m為單位查看分區 swapoff關閉分區 swapon打開分區 添加swap分區——mks

DAY-9 Linux基礎常用命令(5)

mod conf 自己的路 linux操作 解包 二進制安裝 netstat iptables usr 一、Samba(類似共享網盤) 1、功能:Linux操作系統給win用戶共享文件用 2、如何部署 》》準備環境:iptables –F(清除防火墻)、systemctl

SpringMVC基本知識配置,參數的傳遞

core 刪除 子模塊 model delet 設計 轉化 web ucc SpringMVC:1.)SpringMVC和Spring的關系: 軟件開發的三層架構: web層【表示層、表現層】---->Service層---->Dao[DataBase Acce

linux入門基礎知識簡單命令介紹

linux基礎linux入門基礎知識介紹1、計算機硬件組成介紹計算機主要由cpu(運算器、控制器),內存,I/O,外部存儲等構成。 cpu主要是用來對二進制數據進行運算操作,它從內存中取出數據,然後進行相應的運算操作。不能從硬盤中直接取數據。 內存從外部存儲中取出數據供cpu運存。內存的最小單位是

【安全牛學習筆記】tcpdump簡介常用命令實例

信息安全 tcpdump security+ tcpdump簡介 tcpdump 是一個運行在命令行下的嗅探工具。它允許用戶攔截和顯示發送或收到過網絡連接到該 計算機的TCP/IP和其他數據包。tcpdump 是一個在BSD許可證下發布的自由軟件。