Shell指令碼基本編輯規範及變數(詳細)

leec。發表於2020-12-16

一、Shell

●Linux系統中執行的一種特殊程式

1、Shell的作用

shell:介於系統核心與使用者之間,負責解釋命令列

在這裡插入圖片描述

2、使用者的登陸Shell

●使用者登陸Linux系統時,自動載入一個Shell程式
●bash是Linux系統中預設使用的Shell程式
●bash檔案位於/bin/bash

在這裡插入圖片描述

二、Shell指令碼概述

1、將要執行的命令按順序儲存到一個文字檔案
2、給該檔案可執行許可權
3、可結合各種Shell控制語句以完成更復雜的操作

1、Shell指令碼的應用場景

重複性操作
互動性任務
批量事務處理
服務執行狀態監控
定時任務執行
……

三、編寫Shell指令碼

1、編寫指令碼程式碼

1、使用vim文字編輯器
2、每行一條Linux命令,按執行順序依次編寫

在這裡插入圖片描述

2、執行指令碼檔案(三方法)

①方法一:指令碼檔案路徑(絕對路徑與相對路徑,需要x許可權)

在這裡插入圖片描述在這裡插入圖片描述

相對路徑:
在這裡插入圖片描述
絕對路徑
在這裡插入圖片描述在這裡插入圖片描述

②方法二:sh指令碼檔案路徑(不要x許可權)

在這裡插入圖片描述

相對路徑
在這裡插入圖片描述
絕對路徑
在這裡插入圖片描述

③方法三:source或.指令碼檔案路徑(不需要x許可權)

source命令也稱為“點命令”,也就是一個點符號(.),是bash的內部命令
不需要x許可權,也需要使用相對路徑或絕對路徑

在這裡插入圖片描述

3、更完善的指令碼構成

●指令碼宣告
●註釋資訊
●可執行語句

1.指令碼申明(直譯器):若第一行為“#!/bin/bash”,表示此行以下的程式碼語句是通過/bin/bash程式來解釋執行,#!/bin/bash為預設直譯器。還有其它型別的直譯器,比如#!/usr/bin/python、#!/usr/bin/expect。

2.註釋資訊:以“#”開頭的語句表示為註釋資訊,被註釋的語句在執行指令碼時不會被執行。

3.可執行語句:比如echo命令,用於輸出" "之間的字串

編寫過程
在這裡插入圖片描述
執行結果
在這裡插入圖片描述

四、重定向與管道操作

1、互動式硬體裝置

標準輸入:從該裝置接收使用者輸入的資料
標準輸出:通過該裝置向使用者輸出資料
標準錯誤:通過該裝置報告執行出錯資訊

型別裝置檔案檔案描述編號預設裝置
標準輸入/dev/stdin0鍵盤
標準輸出/dev/stdout1顯示器
標準錯誤輸出/dev/stderr2顯示器

2、重定向操作

型別操作符用途
重定向輸入<從指定的檔案讀取資料
重定向輸出>將標準輸出結果 儲存 到指定的檔案,並且覆蓋原有內容
重定向輸出>>將標準輸出結果 追加 到指定的檔案的尾部,不覆蓋原有內容
標準錯誤輸出2>將錯誤資訊 儲存 到指定的檔案,並且覆蓋原有內容
標準錯誤輸出2>>將錯誤資訊 追加 到指定的檔案的尾部,不覆蓋原有內容
混合輸出&>將標準輸出、標準錯誤儲存到同一檔案中
混合輸出2>&1將標準錯誤輸出重定向到標準輸出

例:
setenforce 0
useradd zhangsan
echo “123123” > 1.txt
passwd --stdin zhangsan < 1.txt

在這裡插入圖片描述
例:
cat 1.txt
echo “123123” >> 1.txt
cat 1.txt

在這裡插入圖片描述

例:
ls -lh > log.txt 2>&1 等同於 ls -lh &> log.txt

>(將標準輸出結果儲存到指定的檔案)
2>&1(將標準錯誤輸出重定向到標準輸出)
&>(將標準輸出、標準錯誤輸出儲存到同一檔案)

2、管道符號操作“|”

●將左側的命令輸出結果,作為右側命令的輸入(處理物件),同一行命令中可以使用多個管道。

例:ps aux | wc -l 顯示所有程式數
在這裡插入圖片描述
例:管道符號配合xargs用法
在這裡插入圖片描述

xargs命令可以通過管道接受字串,並將接收到的字串通過空格分割成許多引數(預設情況下是通過空格分割) 然後將引數傳遞給其後面的命令,作為後面命令的命令列引數

五、Shell變數的作用、型別

變數是會變化的值,不會變化的是常量

1、變數的作用

●用來存放系統和使用者需要使用的特定引數(值)
變數名使用固定的名稱,由系統預設或使用者定義
變數值能夠根據使用者設定、系統環境的變化而變化

2、變數的型別

●自定義變數:由使用者自己定義、修改和使用
●特殊變數:環境變數、只讀變數、位置變數、預定義變數

六、自定義變數

定義一個新的變數

變數名=變數值      #變數名以字母或下劃線開頭,區分大小寫,建議全大寫

echo $變數名      #檢視變數的值

在這裡插入圖片描述
等號(=)用來給變數賦值

等號(=)運算子左邊是一個變數名,等號(=)運算子右邊是儲存在變數中的值

1、賦值時使用引號

雙引號:允許通過$符號引用其他變數值

單引號:禁止引用其他變數值, $視為普通字元

反撇號:命令替換,提取命令執行後的輸出結果,``和$(…)作用相同

在這裡插入圖片描述
在這裡插入圖片描述

2、從鍵盤輸入內容為變數賦值

read命令獲取輸入內容
方法一:

read -p 提示資訊 變數名
echo $變數名

在這裡插入圖片描述
方法二:
在指令碼中編寫,在命令列實現read獲取

vim name.sh
#!/bin/bash
read -p “請輸入你的名字” NAME
echo "--------"
read -p “請輸入他的名字” NAME2
echo "--------"
echo "你的名字是"
echo $NAME
echo "他的名字是"
echo $NAME2

在這裡插入圖片描述在這裡插入圖片描述
執行結果:
在這裡插入圖片描述

3、設定變數的作用範圍

可以使用 pstree 命令檢視Shell環境,輸入 bash 命令進入子Shell環境,
按Ctrl+D組合鍵或輸入 exit 命令退出子Shell環境

在這裡插入圖片描述
在這裡插入圖片描述

使用bash命令進入子Shell環境
在這裡插入圖片描述
在這裡插入圖片描述
預設情況下,新定義的變數只在當前的Shell環境中有效,因此稱為區域性變數。當進入子程式或新的子Shell環境時,區域性變數將無法再使用。

可以通過內部命令export將指定的變數匯出為全域性變數,使使用者定義的變數在所有的子Shell環境中能夠繼續使用。

格式1:export 變數名
格式2:export 變數名=變數值

在這裡插入圖片描述
在這裡插入圖片描述

4、整數變數的運算

運算子:+ 加法、- 減法、* 乘法、/ 除法、% 取餘

常用的運算表示式:

i=$(expr 12 \* 5)
i=$((10 * 5))
i=$[10 * 4]
let i=10*3

i++ 相當於 i=$[$i+1]
i-- 相當於 i=$[$i-1]
i+=2 相當於 i=$[$i+2]

在這裡插入圖片描述

七、特殊的Shell變數

1、環境變數

由系統提前建立,用來設定使用者的工作環境
配置檔案:/etc/profile(全域性生效)、~/.bash_profile(當前使用者環境)

2、常見環境變數

PWD、PATH
USER、SHELL、HOME

使用 env 命令可以檢視到當前工作環境下的環境變數
變數USER表示使用者名稱稱HOME表示使用者的宿主目錄LANG表示語言和字符集PWD表示當前所在的工作目錄變數PATH表示可執行程式的預設搜尋路徑

①、PATH(路徑環境變數)

echo $PATH					#檢視當前搜尋路徑
PATH="$PATH:/root"			#將/root目錄新增到搜尋路徑
export PATH="$PATH:/root"	#輸出為全域性環境變數
first.sh

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
已經將該目錄新增到路徑環境變數中,目錄內的所有具有執行許可權的檔案,都可以在當前環境任何目錄中執行

②、只讀變數

用於變數值不允許被修改的情況

readonly 命令設定只讀變數
readonly PRODUCT				#設定為只讀變數
echo $PRODUCT
PRODUCT=Python			        #只讀變數不可以被重新賦值
unset PRODUCT					#只讀變數不可以被刪除,unset 命令用於刪除變數,但無法刪除只讀變數,只能重啟系統解決

在這裡插入圖片描述

③、位置變數

當執行命令列操作時,第一個欄位表示命令名或指令碼程式名,其餘的字串引數按照從左到右的順序依次賦值給位置變數。

$n:n為數字,$0代表命令本身,1~9代表第一個到第九個引數,十以上的引數需要使用大括號表示,比如第十個引數為 ${10}

vim lic.sh
#!/bin/bash
echo $1
echo $2
echo $1 + $2

在這裡插入圖片描述在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

④、預定義變數

$*、$@:表示命令或指令碼要處理的引數。
  $*:把所有引數看成以空格分隔的一個字串整體,代表"$1 $2 $3 $4"。
  $@:把各個引數加上雙引號分隔成n份的引數列表,每個引數是獨立  的,代表"$1" "$2" "$3" "$4"。

$0:表示當前執行的指令碼或命令的名稱。
$#:表示命令或指令碼要處理的引數的個數。	
$?:表示前一條命令或指令碼執行後的返回狀態碼,返回值為0表示執行正確,返回任何非0值均表示執行出現異常。
也常被用於Shell指令碼中return退出函式並返回的退出值。
```csharp
vim mybak.sh
#!/bin/bash
time=backup-`date +%F`.tar.gz
tar zcf $time $* &> /dev/null	#/dev/null表示的是一個黑洞檔案,通常用於丟棄不需要的資料輸出
echo "已執行 $0 指令碼,"
echo "共完成 $# 個物件的備份"
echo "具體內容包括: $*"

chmod +x mybak.sh
./mybak.sh /etc/passwd /etc/shadow

在這裡插入圖片描述
在這裡插入圖片描述在這裡插入圖片描述在這裡插入圖片描述在這裡插入圖片描述

在這裡插入圖片描述在這裡插入圖片描述
在這裡插入圖片描述在這裡插入圖片描述在這裡插入圖片描述

相關文章