文章目錄
- 前言:
- 一、Shell腳本概述
- 二、Shell腳本應用場景
- 三、Shell腳本的作用
- (一)、 Shell腳本的作用:命令解釋器,翻譯官
- (二)、用戶登錄Shell
- 四、撰寫Shell腳本
- (一)、撰寫腳本代碼
- (二)、執行腳本
- 五、重定向與管道操作
- 六、Shell變數的作用、型別
- (一)、變數的作用
- (二)、變數的型別
- 1、自定義變數
- 2、賦值時使用引號
- 3 .從鍵盤輸入內容為變數賦值
- 4.設定變數的作用范圍
- 5.整數變數的運算
- 6、只讀變數
- 7. 特殊Shell變數
- 7.位置變數
前言:
Linux系統中的Shell腳本是一個特殊的應用程式,它介于作業系統內核與用戶之間,充當一個“命令解釋器”的角色,負責接收用戶輸入的操作指令(命令)并進行解釋,將需要執行的操作傳遞給內核執行,并輸出執行結果,
一、Shell腳本概述
1、將要執行的命令吧順序保存到一個文本檔案
2、給該檔案可執行權限,便可運行
3、可結合各種Shell控制陳述句以完成更復雜的操作
二、Shell腳本應用場景
1、重復性操作
2、批量事物處理
3、自動化運維
4、服務運行狀態監控(zabbix)
5、定時任務執行
三、Shell腳本的作用
(一)、 Shell腳本的作用:命令解釋器,翻譯官
1、介于系統內核與用戶之間,負責解釋命令列

2、shell 控制Linux內核,內核態會加載系統硬體提供支持,然后輸出資訊 (結果、bug、err)
3、shell 也可以通過控制應用程式,再進行控制Linux內核
4、應用程式(例如kickstart 無人值守)
5、內核放在boot中,boot還存放的GRUB選單
(二)、用戶登錄Shell
1、登錄后默認使用的Shell程式,一般為/bin/bash
2、不同的Shell的內部指令,運行環境等會有所區別
例如:
[root@localhost ~]#cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
四、撰寫Shell腳本
(一)、撰寫腳本代碼
1、使用vi文本編輯器
2、每行一條Linux命令,按執行順序依次撰寫(從上到下)
3、腳本的構成:
●腳本宣告
●注釋資訊
●可執行陳述句
例如:
vim first.sh
#/bin/bash
#this is my first shell-script
cd /boot
echo "當前目錄位于"
pwd
echo "其中以vml開頭的檔案包括:"
ls -lh vml*
~
vim first.sh :使用vim 撰寫一個腳本first.sh,“.sh”是腳本的一個后綴,方便大家辨識該檔案是腳本檔案,
#!/bin/bash :代表固定格式,相當于宣告
#this is my first shell-script:對于該腳本的注釋資訊,沒有具體作用
cd /boot :跳轉到boot目錄
echo"當前目錄位于":表示輸出字串,方便理解,沒有具體作用
pwd :顯示目前所在作業環境的目錄
echo"其中以vm開頭的檔案包括:":表示輸出字串,方便理解,沒有具體作用
ls -lh vml* :長格式友好顯示(帶有單位)以vml開頭的所有檔案,
(二)、執行腳本
注意:我們在執行腳本前我們要養成賦予腳本可執行權限的習慣
即:
[root@localhost ~]# chmod +x first.sh
[root@localhost ~]# ls -l
-rwxr-xr-x. 1 root root 37 Nov 25 22:22 first.sh
執行腳本的四種方式:
方法一:sh腳本檔案路徑
[root@localhost ~]# sh first.sh
此方法不要求腳本擁有執行權限,如果腳本中執行了切換位置的命令,此方式不會進行切換,

方法二:source腳本檔案路徑
[root@localhost ~]# source first.sh
此方法也不要求腳本擁有執行權限,但若腳本中執行了切換位置的命令,此方式會進行切換,

方法三:“.”腳本檔案路徑
[root@localhost ~]# . first.sh
此方式與方法二類似,但就生產環境而言,我們一般很少使用此方式,該方法同樣會切換目錄,

方法四:腳本檔案路徑(絕對路徑與相對路徑)
[root@localhost ~]# ./first.sh
此方法需要賦予執行權限

五、重定向與管道操作
(一)、互動式硬體設備
標準輸入:從該設備接收用戶輸入的資料
標準輸出:通過該設備向用戶輸出資料
標準錯誤:通過該設備報告執行錯誤資訊
| 型別 | 設備檔案 | 檔案描述編號 | 默認設備 |
|---|---|---|---|
| 標準輸入 | /dev/stdin | 0 | 鍵盤 |
| 標準輸出 | /dev/stdout | 1 | 顯示幕 |
| 標準錯誤輸出 | /dev/stderr | 2 | 顯示幕 |
(二)、重定向操作與管道操作
1 、重定向操作
| 型別 | 運算子 | 用途 |
|---|---|---|
| 重定向輸入 | < | 從指定的檔案讀取資料,而不是從鍵盤輸入 |
| 重定向輸出 | > | 將輸出結果保存到指定的檔案(覆寫原有內容) |
| 重定向輸出 | >> | 將輸出結果追加到指定的檔案尾部 |
| 標準錯誤輸出 | 2> | 將錯誤資訊保存到指定的檔案(覆寫原有內容) |
| 標準錯誤輸出 | 2>> | 將錯誤資訊追加到指定的檔案中 |
| 混合輸出 | &> | 將標準輸出、標準錯誤的內容保存到同一個檔案中 |
| 混合輸出 | 2>&1 | 將標準錯誤輸出重定向到標準輸出 |
注意:
echo "123123" > pass.txt #將123132重定向輸出到pass.txt檔案中
passwd --stdin zhangsan < pass.txt #將pass.txt檔案內容重定向輸入到張三的鍵盤密碼中
ls -lh > log.txt 2>&1 等同于 ls -lh &> log.txt #將ls -lh的標準輸出和標準錯誤輸出都保存在log.txt檔案中
2、管道運算子號“|”
將左側的命令輸出結果,作為右側命令的處理物件
格式:cmd1 | cmd2 [… | cmdn]
例如:
ps aux | wc -l #以行格式顯示行程數
echo “123123” | passwd --stdin lisi #將lisi的密碼設為123123
補充:xargs命令可以通過管道接受字串,并將接收到的字串通過空格分割成許多引數(默認情況下是通過空格分割) 然后將引數傳遞給其后面的命令,作為后面命令的命令列引數,
六、Shell變數的作用、型別
(一)、變數的作用
為靈活管理Linux系統提供特定的引數,包含兩層意思:
變數名:使用固定的名稱,由系統預設或用戶定義
變數值:能夠根據用戶設定、系統環境的變化而變化
(二)、變數的型別
自定義變數:由用戶自己定義、修改和使用
環境變數:由系統維護,用于設定作業環境(例如PATH)
只讀變數:變數值不允許被修改,只允許讀
位置變數:通過命令列給腳本程式傳遞引數
預定義變數:Bash中內置的一類變數,不能直接修改 (例如0 、 0、0、*、$#)
1、自定義變數
定義一個新的變數
變數名以字母或下劃線開頭,區分大小寫,建議全部大寫
變數名=變數值
“=” 為賦值符號,代表把賦值符號右邊的內容賦予給左邊的變數名,=兩邊不要有空格
變數名的命名,以字母或者下劃線開頭,例如:
ADDR="192.168.226.100"; #以大寫字母開頭
_ABC="hello" #以下劃線開頭
查看變數的值
在輸出時,需要在變數名前加上$符號
例如:
[root@localhost ~]# ADDR=192.168.226.100
[root@localhost ~]# echo $ADDR
192.168.226.100
此處需要注意:
如果重新賦予新的值,那么命名的值會更新(覆寫)
允許同時輸出兩個變數:
[root@localhost?~]#ADDR="192.168.226.100"
[root@localhost?~]#_ABC="hello"
[root@localhost?~]#echo $ADDR
192.168.226.100
[root@localhost?~]#echo $_ABC
hello
[root@localhost?~]#echo $ADDR $_ABC
192.168.226.100 hello
2、賦值時使用引號
雙引號:允許通過$符號參考其他變數值
單引號:禁止參考其他變數值,$視為普通字符
反撇號:命令替換,提取命令執行后的輸出結果
[root@localhost?~]#ABC=shell
[root@localhost?~]#echo $ABC
shell
[root@localhost?~]#echo "$ABC"3.0 #雙引號的使用可以參考變數的值
shell3.0
[root@localhost ~]#echo "$ABC3.0" #這種參考方法是錯誤的,添加的內容要么放“”后面,要么放$前面
.0
[root@localhost ~]#echo "我愛$ABC"
我愛shell
[root@localhost ~]#echo '$ABC'3.0 #單引號的使用是直接將單引號中的內容輸出
$ABC3.0
[root@localhost ~]#AAA=`echo "我愛$ABC"` #反撇號的使用是提取``中的echo "我愛$ABC"的輸出結果,作為自己的變數值
[root@localhost ~]#echo $AAA
我愛shell
[root@localhost ~]#BBB=$(echo "我愛$ABC") #使用()也具有反撇號的作用,不過要在()前面加上$符號
[root@localhost ~]#echo $BBB
我愛shell
3 .從鍵盤輸入內容為變數賦值
read [-p "提示資訊"] 變數名
示例:
[root@localhost ~]#read -p "請輸入你的年齡:" AGE #AGE這個變數名前面有空格
請輸入你的年齡:25
[root@localhost ~]#echo $AGE #從鍵盤輸入的變數值25就賦值給了變數名AGE
25
vim name.sh
#!/bin/bash
#this is shell-script
read -p "請輸入你的名字:" name
echo "------------------------"
echo "請輸入他的名字:"
read name2
echo "-----------"
echo "你的名字$name"
echo "他的名字$name2"
chmod +x name.sh
[root@localhost ~]#./name.sh
請輸入你的名字:gcc
------------------------
請輸入他的名字:
lisi
-----------
你的名字gcc
他的名字lisi
4.設定變數的作用范圍
(1)變數作用范圍
默認情況下,新定義的變數只在當前的shell環境中有效,因此稱為區域變數,當進入子程式或新的子shell環境時,區域變數將無法在使用
可以使用 pstree 命令查看Shell環境,輸入 bash 命令進入子Shell環境,
使用pstree命令查看當前的shell環境


(2)命令格式:
可以通過內部命令export指定變數匯出為全域變數,使用戶定義變數在所有的子shell環境中能夠繼續使用
格式1: export 變數名
格式2: export 變數名=變數值
5.整數變數的運算
整數變數的運算:
expr 變數1 運算子 變數2 [運算子 變數3]...
常用運算子:
加法運算:+
減法運算:-
乘法運算:\*
除法運算:/
求模(取余)運算:%
舉例:
[root@localhost opt]# exit
exit
[root@localhost opt]# expr 3+2 '錯誤格式,不加空格'
3+2
[root@localhost opt]# expr 3 + 2 '正確格式,加法運算'
5
[root@localhost opt]# expr 3 - 2 '正確格式,減法運算'
1
[root@localhost opt]# expr 3 * 2 '錯誤格式,乘法運算'
expr: syntax error
[root@localhost opt]# expr 3 \* 2 '正確格式,乘法運算'
6
[root@localhost opt]# expr 3 / 2 '正確格式,除法運算'
1
[root@localhost opt]# expr 3 % 2 '正確格式,取余運算'
1
[root@localhost opt]# expr 32 % 21
11
[root@localhost opt]# expr 32 % 5
2
[root@localhost?~]#a=$(expr 5\*2) #錯誤格式\*兩邊沒加空格
[root@localhost?~]#echo $a
5*2
[root@localhost?~]#a=$(expr 5 \* 2) #正確格式,\*兩邊加空格
[root@localhost?~]#echo $a
10
[root@localhost ~]#a=$((5 * 2)) #使用雙括號(())進行運算,此時* (運算子)兩邊也需要空格
[root@localhost ~]#echo $a
10
[root@localhost ~]#a=$[5 * 2] #使用[]進行運算,* (運算子)兩邊也需要空格
[root@localhost ~]#echo $a
10
6、只讀變數
用于變數值不允許被修改的情況
readonly 命令設定只讀變數
readonly PRODUCT #設定為只讀變數
echo $PRODUCT
PRODUCT=Python #只讀變數不可以被重新賦值
unset PRODUCT #只讀變數不可以被洗掉,unset 命令用于洗掉變數,但無法洗掉只讀變數,只能重啟系統解決
7. 特殊Shell變數
環境變數:
由系統提前創建,用來設定用戶的作業環境
組態檔: /etc/profile、~/.bash_profile
常見的環境變數:
使用 env 命令可以查看到當前作業環境下的環境變數
USER表示用戶名稱,
HOME表示用戶的宿主目錄,
LANG表示語言和字符集,
PWD表示當前所在的作業目錄,
PATH表示可執行程式的默認搜索路徑
舉例:
[root@localhost ~]#PATH="$PATH:/root"
[root@localhost ~]#echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root #就把/root加入到全域環境變數中去了
7.位置變數
位置表示為$n,n為1~9之間的數字

預定義變數:
$#:命令列中位置變數的個數
$*:所有位置變數的內容
$?:上一條命令執行后回傳的狀態,當回傳狀態值為0時表示執行正常,非0值表示執行例外或出錯
$0:當前執行的行程/程式名
$*、$@:表示命令或腳本要處理的引數,
$*:把所有引數看成以空格分隔的一個字串整體,代表"$1 $2 $3 $4",
$@:把各個引數加上雙引號分隔成n份的引數串列,每個引數是獨立 的,代表"$1" "$2" "$3" "$4",
vim nnn.sh
#!/bin/bash
echo $1
echo $2
echo "$[$1 + $2]"
echo $0
[root@localhost ~]#chmod +x nnn.sh
[root@localhost ~]#./nnn.sh 10 20 30 40
10
20
30
./nnn.sh
[root@localhost ~]#echo $?
0
[root@localhost opt]#
%Y 表示年
%m 表示月
%d 表示日
%H 表示小時
%M 表示分鐘
%S 表示秒
%s 表示從 1970 年 1 月 1 日 00:00:00 UTC 到目前為止的秒數,相當于time函式
%w 表示一周中的第幾天,
[root@localhost opt]#date
2020年 12月 16日 星期三 16:14:03 CST
[root@localhost opt]#date +%s '從 1970 年 1 月 1 日 00:00:00 UTC 到目前為止的秒數(時間戳)'
1608106480
[root@localhost opt]# date +%F '顯示當前日期'
2020-12-16
[root@localhost opt]# date +%Y%m%d '顯示年月日'
20201216
[root@localhost opt]# date "+%Y-%m-%d %H-%M-%S" 現在的時間是:
現在的時間是:2020-12-16 16-16-20
[root@localhost opt]# date "+%Y-%m-%d %H-%M-%S" -d "-3 year" 三年前的時間是:
三年前的時間是:2016-11-26 00-23-31
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/236010.html
標籤:其他
下一篇:職場小白淺談網路優化
