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許可證下發布的自由軟件。