Shell指令碼基本編輯規範及變數(詳細)
一、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/stdin | 0 | 鍵盤 |
標準輸出 | /dev/stdout | 1 | 顯示器 |
標準錯誤輸出 | /dev/stderr | 2 | 顯示器 |
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
相關文章
- shell指令碼之變數定義規範及使用指令碼變數
- 編寫shell指令碼的規範指令碼
- Shell指令碼程式設計規範與變數(shell指令碼必須要知道的規矩!)指令碼程式設計變數
- shell指令碼中的變數及應用指令碼變數
- Shell程式設計規範與變數程式設計變數
- Linux shell程式設計(一)shell指令碼中的變數詳解Linux程式設計指令碼變數
- 01 shell程式設計規範與變數程式設計變數
- 編碼規範:不要用引數控制程式碼邏輯
- 技能篇:shell教程及指令碼編寫指令碼
- linux shell 指令碼語言教程(超詳細!)Linux指令碼
- Shell指令碼開發基本規範有哪些?linux學習用哪個系統好指令碼Linux
- shell指令碼——基本運算子指令碼
- shell-----構建基本指令碼指令碼
- 程式碼規範之前端編寫碼規範前端
- 自動化指令碼安裝mysql shell指令碼範例指令碼MySql
- shell指令碼正規表示式指令碼
- stylus編碼規範
- html編碼規範HTML
- Pear 編碼規範
- CSS編碼規範CSS
- Javascript編碼規範JavaScript
- python編碼規範Python
- 【Linux】什麼是shell指令碼?shell變數分為哪幾類?Linux指令碼變數
- 快速用上 editorconfig 來規範編輯
- shell 正規表示式詳細整理
- shell指令碼程式設計學習筆記——變數指令碼程式設計筆記變數
- 10 個實戰及面試常用 Shell 指令碼編寫面試指令碼
- 02 . Shell變數和邏輯判斷及迴圈使用變數
- shell指令碼(14)-正規表示式指令碼
- 如何編寫高效的 Shell 指令碼指令碼
- 如何使用zx編寫shell指令碼指令碼
- .Net Core 編碼規範
- 前端安全編碼規範前端
- WEB前端編碼規範Web前端
- 常見編碼規範
- .Net編碼規範整理
- [轉]Shell向Perl指令碼中傳遞變數的方法指令碼變數
- web前端開發編碼規範及效能優化Web前端優化