1.Shell概述
1.1 Shell簡介
- Shell是一個命令解釋器,它的作用是解釋執行用戶輸入的命令及程序等,用戶每輸入一條命令,Shell就解釋執行一條。這種從鍵盤一輸入命令,就可以立即得到迴應的對話方式,稱爲交互的方式。
- Shell存在於操作系統的最外層,負責與用戶直接對話,把用戶的輸入解釋給操作系統,並處理各種各樣的操作系統的輸出結果,然後輸出到屏幕返回給用戶。簡單來說Shell就是一個用戶跟操作系統之間的一個命令解釋器。
- Shell是用戶與Linux操作系統之間溝通的橋樑。用戶可以輸入命令執行,又可以利用shell腳本編程去運行。
1.2 Shell腳本
當命令或程序語句不在命令行下執行,而是通過一個程序文件來執行,按照順序執行。該程序就被稱爲Shell腳本。Shell腳本類似於DOS系統下的批處理程序。
1.3 Shell分類
[root@Centos7 ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
echo $BASH可以查看到當前登錄的shell
1.4 Shell腳本開發的基本規範
1.Shell腳本的第一行是指定腳本解釋器。
其中,開頭的“#!”字符又稱爲幻術,在執行shell腳本的時候,內核會根據“#!”後的解釋器來確定該用那個程序解釋這個腳本的內容。一個規範的Shel腳本在第一行會指出由那個程序(解釋器)來執行腳本中的內容。如#!/bin/bash。
2.Shell腳本的開頭會加版本、版權等信息
#Date 22:55 2020-3-12
#Author Create by ww
Blog:http://***.com
#Description:This scripts functions is....
#Verson:1.1
1.5 Shell註釋
在shell中以#開始表示,整個行就被當作一個註釋,不會被程序執行。
1.6 SHELL腳本的執行
先準備一個測試文件,往裏面寫入內容。
[root@CentOS7 ~]# echo "echo 'hello'" > test.sh
1.6.1 bash script-name或sh script name
這是當腳本文件本身沒有可執行權限或者腳本文件開頭沒有指定解釋器時需要使用的方法。
1.6.2 path/script-name或./script-name
指在當前路徑下執行腳本(腳本需要有執行權限),具體方法爲chmod +x script-name。然後通過絕對路徑或相對路徑就可以直接執行腳本。
1.6.3 source script-name或. script-name
使用source或“.”讀入或加載指定的shell腳本文件,然後依次執行指定的shell腳本文件種的所有語句。這些語句將在當前父shell腳本進程種運行。使用source或.執行腳本時,不會創建子進程,而是在父進程中直接執行。
1.6.4 sh<script-name或cat script-name | sh
2.shell變量
Shell給一個變量賦值,實際就是定義了變量。變量的賦值方式爲:先寫變量名稱,然後是“=”這個字符,最後是值,中間無任何空格,變量的內容一般要加雙引號,防止出錯,特別是當值內容之間有空格時。要使用變量的值是,在變量名前面加上$符號。
2.1 強引用和弱引用
被一對雙引號括起來的變量替換是不會被阻止的,雙引號被稱爲弱引用或部分引用;被一對單引號括起來的變量就會被禁止,變量名只會被解釋成字面的意思,不會發生變量替換,單引號被稱爲強引用或全引用;反引號和$()一樣,引號或括號裏得命令會優先執行,如果存在嵌套,反引號不能用。
2.2 變量的設置規則
- 變量名只能使用英文字母,數字或下劃線,且首字母不能以數字開頭。
- 等號=用於爲變量分配值,在使用過程中等號兩邊不能有空格。
- 變量名區分大小寫。
- 要對變量進行引用,可以在變量名前加$美元符。
- 變量中間不能有空格,可以使用下劃線(_)。
2.3 變量類型
2.3.1 本地變量
當前用戶自定義的變量,當前進程中有效,其他進程及當前進程的子進程無效。
[root@Centos7 ~]# a=123
[root@Centos7 ~]# echo $a
123
[root@Centos7 ~]# su - ycy
Last login: Tue Sep 24 22:42:37 CST 2019 on pts/0
[ycy@Centos7 ~]$ echo $a
2.3.2 環境變量
當前進程有效,並且能夠被子進程調用。su -切換用戶之後不生效。變量名通常要大寫。
env:查看當前用戶的環境變量
export:用於設置環境變量。修改後維持不變,直到當前shell消亡。
set:查詢當前用戶的所有變量(臨時變量與環境變量)
declare:輸出所有的變量、函數、整數和已經到處的變量。
設置PATH環境變量
shell要執行一個程序,它要在系統中去搜索這個程序的路徑,PATH變量是用來定義bash查找命令的目錄。當我們安裝了第三方程序後,可以把第三方程序bin目錄添加到這個PATH路徑內,就可以在全局調用這個第三方程序。
定義一個環境變量:export name=value或者name=value; export name或者declare -x name=value
[root@CentOS7 ~]# echo "export PATH=/opt/:$PATH" >> /etc/profile
[root@CentOS7 ~]# source /etc/profile
2.3.3 全局變量
全局所有的用戶和程序都能夠調用且繼承,新建的用戶也能默認調用。
文件名 | 說明 | 備註 |
---|---|---|
$HOME/.bashrc | 當前用戶的bash信息,用戶登錄時讀取 | 定義別名、umask、函數等 |
$HOME/.bash_profile | 當前用戶的環境變量,用戶登錄時讀取 | |
$HOME/.bash_logout | 當前用戶退出當前shell時最後讀取 | 定義用戶退出時執行的程序等 |
/etc/bashrc | 全局的bash信息,所有用戶都生效 | |
/etc/profile | 全局環境變量信息 | 系統和所有用戶都生效 |
$HOME/.bash_history | 當前用戶的歷史記錄 |
用戶登錄系統讀取相關文件的順序
當一個用戶登錄的時候,首先去讀取全局的環境變量文件/etc/profile,再去讀當前用戶的環境變量文件HOME/.bashrc,然後讀取全局的bash信息/etc/bashrc,退出的時候讀取$HOME/.bash_logout。
2.3.4 系統變量(內置bash中變量)
shell本身已經固定好了它的名字和作用。如下表。
內置變量 | 說明 |
---|---|
$0 | 獲取當前執行shell腳本的文件名。如果執行腳本包含了路徑,那麼就包括腳本路徑。 |
$n | 獲取當前執行的Shell腳本的第n個參數值,n=1…9。當n爲0時表示腳本的文件名;當n大於9,則用花括號括起來,如${10},接的參數以空格隔開 |
$? | 獲取執行上一個指令的執行狀態返回值(0爲成功,非0爲失敗)。可根據返回值來判斷軟件的安裝步驟是否成功;也可更具返回值來確定網站備份是否正確。 判斷命令、腳本或函數等程序是否執行成功。 若在腳本中調用執行“exit數字”,則會返回這個數字給“?”。 |
$# | 獲取當前執行的shell腳本後面接的參數的總個數(不包括程序本身) |
$* | 獲取當前shell腳本所有傳參的參數。不加引號和加上雙引號如“$”,則表示將所有的參數視爲單個字符串,相當於“$1 $2 $3”. |
$@ | 獲取當前shell腳本所有傳參的參數。不加引號和@加上雙引號如"$@",則表示將所有的參數視爲不同的獨立字符串,相當於“$1”“$2”“@”和“$*”都加雙引號時,二者有區別;都不加雙引號,二者無區別。 |
$$ | 獲取當前執行的Shell腳本的進程號(PID) |
$! | 獲取上一個在後臺工作的進程的進程號(PID) |
!$ | 調用最後一條命令歷史中的參數 |
$_ | 獲取在此之前執行的命令或腳本的最後一個參數 |
[root@CentOS7 ~]# cat test.sh
echo $0 #打印腳本的文件名
echo "========================="
echo $1 #打印腳本傳遞的第一個參數值
[root@CentOS7 ~]# sh test.sh hello #把傳入的hello參數賦值給腳本中的$1並輸出
test.sh
=========================
hello
2.4 變量的定義方式
2.4.1 基本方式name=value
[root@Centos7 ~]# a=123
[root@Centos7 ~]# echo $a
123
2.4.2 命令執行結果賦值給變量
[root@Centos7 ~]# time=`date +"%F %T"`
[root@Centos7 ~]# echo $time
2019-09-24 22:48:57
2.5 交互式變量read
從標準輸入讀取字符串等信息,傳給shell程序內部定義的變量。
用法:read [OPTION] name
OPTION | 說明 |
---|---|
-p | 定義提示用戶的信息 |
-n | 定義字符數(限制變量值的長度) |
-s | 不顯示(不顯示用戶輸入的內容) |
-t | 定義超時時間,默認爲s(限制用戶輸入變量值的超時時間) |
# 用戶自定義變量值
[root@Centos7 ~]# read name
python
[root@Centos7 ~]# echo $name
python
[root@Centos7 ~]# read -p "Input your name:" nam
Input your name:shell
[root@Centos7 ~]# echo $name
shell
# 變量值來自文件
[root@Centos7 ~]# echo 192.168.146.101 > ip.txt
[root@Centos7 ~]# read -p "Input you IP:" IP < ip.txt
[root@Centos7 ~]# echo $IP
192.168.146.101
2.6 定義有類型的變量declare
給變量做一些限制,固定變量的類型,比如:整型、只讀。
用法:declare [OPTION] name=value
OPTION | 說明 |
---|---|
-i | 將變量看成整數 |
-r | 定義只讀變量 |
-a | 定義普通數組,查看普通數組 |
-A | 定義關聯數組;查看關聯數據 |
-x | 將變量通過過環境導出。declare -x a=123等於export a=123 |
[root@Centos7 ~]# declare -i a=123
[root@Centos7 ~]# echo $a
123
[root@Centos7 ~]# a=python
[root@Centos7 ~]# echo $a
0
2.7 只讀變量
使用readonly 變量名可以將變量定義爲只讀變量,只讀變量的值不能被改變。
[root@CentOS7 ~]# readonly a=5
[root@CentOS7 ~]# a=10
-bash: a: readonly variable
2.8 變量的刪除
使用unset 變量名的形式刪除變量。變量被刪除後不能再次使用。unset命令不能刪除只讀變量。
3.運算符
3.1 算術運算符號
運算符 | 說明 |
---|---|
+、-、*、/、%、 | 加法(或正號)、減法(或負號)、乘法、除法、取餘(取模) |
** | 冪運算 |
++、– | 增加及減少,可前置也可放在變量結尾 |
!、&&、|| | 邏輯與、邏輯或、邏輯非 |
<、<=、>、>= | 比較符號(小於、小於等於、大於、大於等於) |
==、!=、= | 比較符號(相等、不相等、對於字符串“=”也可以相當於) |
<<、>> | 向左移位、向右移位 |
~、|、&、^ | 按位取反、按位異或、按位與、按位或 |
=、+=、-=、*=、/=、%= | 賦值運算符 |
3.2 算術運算命令
運算操作符與運算命令 | 意義 |
---|---|
$( ( ) ) | 用於整數運算的常用操作符,效率很高 |
$[] | 用於整數運算 |
let | 用於整數運算,類似於“( ( ) )”,兩個數值之間需用空格隔開 |
expr | 可用於整數運算(乘號*需用反斜槓那個轉義) |
bc | Linux下的一個計算器程序(適合整數及小數運算) |
awk | 即可用於整數運算,也可用於小數運算 |
declare | 定義變量值和屬性,-i參數可以用於定義整型變量,做運算 |
[root@Centos7 ~]# echo $(( 1+1 ))
2
[root@Centos7 ~]# echo $[ 1+5 ]
6
[root@Centos7 ~]# a=1;let a=a+1;echo $a
2
[root@Centos7 ~]# expr 1+1 # +號左右需有空格
1+1
[root@Centos7 ~]# expr 1 + 1
2
[root@Centos7 ~]# expr 5 \* 2 *需使用\轉義
10
[root@Centos7 ~]# echo 1.1+1.1 | bc
2.2
[root@Centos7 ~]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
0.2+0.3
.5
2*0.4
.8
quit
[root@Centos7 ~]# bc -q
scale=2
1.2 / 2
.60
quit
[root@Centos7 ~]# i=1;let i++;echo $i
2
[root@Centos7 ~]# j=1;let ++j;echo $j
2
[root@Centos7 ~]# let a=i++ #先賦值,再運算
[root@Centos7 ~]# let b=++j #先運算,再賦值
[root@Centos7 ~]# echo $i
3
[root@Centos7 ~]# echo $j
3
[root@Centos7 ~]# echo $a
2
[root@Centos7 ~]# echo $b
3
3.3 expr命令
對數字的基本運算。作比較時,輸出結果假爲0;1爲真;特殊符號用轉義符。
3.4 雙小括號(())
進行數值運算與數值比較,效率很高,用法靈活。
運算操作符與運算命令 | 意義 |
---|---|
( ( i=i+1 ) ) | 先運算後賦值,可用echo$( ( i=i+1 ) )輸出其值 |
i=$( ( i+1 ) ) | 可以再“(())”前加$符,表示將表達式運算後賦值給I |
( ( 8>7&&5==5 ) ) | 可以進行比較操作,還可以加入邏輯與和邏輯或,用於條件判斷 |
echo $( ( 2+1 ) ) | 需要直接輸出運算表達式的運算結果是,可以在“( ( ) )”前加$符 |
3.5 test命令
test命令用於檢查某個條件是否成立,它可以進行數值、字符和文件三個文件方面的測試。
格式爲:test 測試條件
如果結果爲真,用$?=0表示,反之爲假,用非0表示。