shell 簡單腳本編程

来源:https://www.cnblogs.com/thelovelybugfly/archive/2019/04/26/10777219.html
-Advertisement-
Play Games

shell腳本編程 編譯器,解釋器 編程語言: 機器語言,彙編語言,高級語言 靜態語言:編譯型語言 強類型(變數) 事先轉換成可執行格式 C,C++,JAVA,C# 動態語言:解釋型語言,on the fly 弱類型 邊解釋邊執行 ASP,ASP.NET,PHP,SHELL,PYTHON,PERL ...


shell腳本編程
編譯器,解釋器

編程語言: 機器語言,彙編語言,高級語言

靜態語言:編譯型語言
強類型(變數)
事先轉換成可執行格式
C,C++,JAVA,C#


動態語言:解釋型語言,on the fly
弱類型
邊解釋邊執行
ASP,ASP.NET,PHP,SHELL,PYTHON,PERL


shell: 弱類型編程語言
強類型: 變數在使用前,必須事先聲明,甚至需要初始化
弱類型: 變數用時聲明,甚至不區分類型

 

bash變數類型:
環境變數:作用域為當前shell進程及其子進程
export name=value
或者name = value
export name
"導出"
腳本在執行時會啟動一個子shell進程:
命令行中啟動的腳本會繼承當前的shell環境變數
系統自動執行的腳本(非命令行啟動)就需要自我定義需要的各環境變數


本地變數(局部變數):
引用變數:${變數名},括弧可省略。變數替換 強引用 用"" 雙引號
set name=value : 作用域為整個bash進程
局部變數:
local name=value ,作用域為當前代碼段:

撤銷變數
unset name

查看當前shell 中的變數: set(查看所有變數)

查看當前shell 中得環境變數
printenv
env
export

位置變數
$1, $2....
特殊變數(系統變數)
$? : 上一個命令執行狀態返回值;


程式執行:可能有兩個狀態返回值
程式執行結果
程式返回代碼 (0-255)
0 : 正確執行
1-255:錯誤執行
1,2,127為系統預留執行返回代碼


/dev/null : 軟體設備, bit bucket , 數據黑洞


腳本:
命令的堆砌,按照實際需要,結合命令流程式控制制機制實現的源程式
shebang: 魔數
#/bin/bash 指明執行的腳本執行路徑
# 註釋行,不執行

變數追加
name=aaaa
echo $name
name=$name:bbb
echo name
完成變數的內容追加,類似數組添加元素



條件判斷:
bash中,如何實現條件判斷?
條件測試類型:
整數測試:
字元測試:
文件測試:

條件測試的表達式:
[ expression ] : []兩端必須要有空格 命令測試法
[ [expression] ] 關鍵字測試法
test expression

如:
INT1=55
INT2=65
[ $INT1 -eq INT2 ]
[ [ $INT1 -eq INT2 ] ]
test $INT1 -eq INT2


整數比較:
-eq : 是否相等 $A -eq $B
-ne : 是否不等: 不等為true,否則為false。
-gt : 大於
-lt : 小於
-ge : 大於或等於
-le : 小於或等於


命令間的邏輯關係:
邏輯與: &&
第一個條件為假時,第二條件不再判斷,最終結果已有:
第一個條件為真時,第二條件必須判斷

邏輯或: ||


編程風格——>> 變數名稱:
1 只能包含字母,數字和下劃線,並且不能以數字開頭。
2 不能跟系統中已有的環境變數重名。
3 最好見名知意

條件判斷: 控制結構
單分支if 語句:

if 判斷條件; then
statement 1
statement 2
statement 3
...
fi

雙分支if 語句:
if 判斷條件;then
statement 1
statement 2
statement 3
..
else
statement 4
statement 5
...
fi



shell中的算術運算:
A=3,B=6
1 let 算術運算表達式
let C =$A+$B
2 $[ 算術運算表達式]
C =${$A+$B}

3 $((算術運算表達式))
C = $(($A+$B))

4 expr 算術運算表達式, 表達式中各操作數及運算符之間要有空格,並且要使用命令引用
C = `expr $A + $B `




文件測試:
- e FILE(文件名或者文件路徑) : 測試文件是否存在 isexit
- f FILE : 測試文件是否為普通文件
- d FILE :測試指定路徑是否為目錄
- r FILE : 測試當前用戶對指定路線是否可讀。
- w FILE : 測試當前用戶對指定路線是否可寫。
- x FILE : 測試當前用戶對指定路線是否可執行。

[ -e /etc/inittab ]


測試腳本是否有語法錯誤
bash - n 腳本
bash - x 腳本 逐步展示執行過程


定義腳本退出狀態碼:
exit : 退出腳本(後面跟上需要的狀態碼)
如果腳本沒有明確定義退出狀態碼,那麼最後執行的一條命令的突出碼即為腳本的退出碼。
exit 0-255

bash的變數類型
本地變數(局部變數)
環境變數
位置變數:
$1,$2.... (參數位置)
shift: 參數輪替,後面跟數字,實現輪替的步進
./file.sh /etc/inittab /etc/test
$1: /etc/inittab
$2: /etc/test
特殊變數:
$? : 上一條命令的退出狀態碼
$# : 參數的個數
$* : 參數列表
$@ : 參數列表

字元測試:
==:測試是否相等,相等為真,不等為假
!=: 測試是否不等,不等為真,等為假
>
<
-n string: 測試指定字元串是否為空,空則真,不空則假
-z string: 測試指定字元串是否不空,不空為真,空則為假

 

#!/bin/bash
#
if [ $1 = 'q' ];then
  echo "Quiting..."
  exit 1
elif [ $1 = 'Q' ];then
  echo "Quiting..."
  exit 2  
elif [ $1 = 'quit' ];then
  echo "Quiting..."
  exit 3 
elif [ $1 = 'Quit' ];then
  echo "Quiting..."
  exit 4  
else
  echo $1
fi

迴圈:進入條件,退出條件
for
while
until

for 變數 in 列表; do
迴圈體
done

for I in 1 2 3 4 5 6 7 8 9 10; do
加法運算
done

遍歷完成之後,退出;

如何生成列表:
{1..100}
`seq [起始數 [步進長度]] 結束數`


1,...,100

declare -i SUM=0
integer
-x

計算100以內所有奇數的和以及所有偶數的和;分別顯示之;

let I=$[$I+1]
SUM=$[$SUM+$I]

let SUM+=$I

let I+=1 相當於 let I++

-=
    let I-=1 相當於 let I--
    
    ++I, --I

 

寫一個腳本,分別顯示當前系統上所有預設shell為bash的用戶和預設shell為/sbin/nologin的用戶,並統計各類shell下的用戶總數。顯示結果形如:
BASH,3users,they are:
root,redhat,gentoo

NOLOGIN, 2users, they are:
bin,ftp


#!/bin/bash
#
NUMBASH=`grep "bash$" /etc/passwd | wc -l`
BASHUSERS=`grep "bash$" /etc/passwd | cut -d: -f1`
BASHUSERS=`echo $BASHUSERS | sed 's@[[:space:]]@,@g'`

echo "BASH, $NUMBASH users, they are:"
echo "$BASHUSERS

測試:
整數測試
-le
-lt
-ge
-gt
-eq
-ne
字元測試
==
!=
>
<
-n
-z
文件測試
-e
-f
-d
-r
-w
-x

if [ $# -gt 1 ]; then

組合測試條件
-a: 與關係
-o: 或關係
!: 非關係

if [ $# -gt 1 -a $# -le 3 ]
if [ $# -gt 1 ] && [ $# -le 3 ]

q, Q, quit, Quit



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在前後端分離的大環境下,API介面文檔成為了前後端交流的一個重點。Swagger讓開發人員擺脫了寫介面文檔的痛苦。 官方網址:https://swagger.io/ 在.Net Core WebApi中通過簡單配置即可使用這一強大的功能。 1.新建一個API的項目 選擇 API 項目 2.引入Swa ...
  • 通過使用Http定義的伺服器的交互方法,進行更新與刪除。 PUT通常用於向伺服器發送請求,如果URI不存在,則要求伺服器根據請求創建資源,如果存在,伺服器就接受請求內容,並修改URI資源的原始版本。如果新的資源被創建,這個原始伺服器就必須通過201(Created)響應通知用戶代理。如果已有... ...
  • 一.概述 在Ocelot中,為了保護下游api資源,用戶訪問時需要進行認證鑒權,這需要在Ocelot 網關中添加認證服務。添加認證後,ReRoutes路由會進行身份驗證,並使用Ocelot的基於聲明的功能。在Startup.cs中註冊認證服務,為每個註冊提供一個方案 (authenticationP ...
  • 當一個頁面中添加了許多同類型控制項,當需要控制這些控制項進行顯示或隱藏的時候,需要一個個的將Visible屬性設置為false,十分不方便, 後通過論壇受一位大神(至於叫什麼忘了)的啟發,通過建立控制項數組的方式可以實現同種控制項批量修改同一屬性。 ToolStripStatusLabel[] Tlable ...
  • 今天早上六點半左右微信群里就看到張隊發的關於.NET Spark大數據的鏈接https://devblogs.microsoft.com/dotnet/introducing net for apache spark/ ,正印證了“微軟在不斷通過.NET Core補齊各領域開發,真正實現一種語言的跨 ...
  • 原文: C#中DataTable中的Compute方法使用收集 Compute函數的參數就兩個:Expression,和Filter。 Expresstion是計算表達式,關於Expression的詳細內容請看這裡“http://msdn2.microsoft.com/zh-cn/library/s ...
  • 下麵我們通過以下的簡單的SQL語句即可實現數據的批量導入,代碼如下: Bulk insert id From 'G:\文檔\test.txt' With ( fieldterminator=',', rowterminator='\n')註意:1) bulk insert 為Sql server 中 ...
  • 一、流編輯器 sed 與命令 sed Linux 中,常使用流編輯器 sed 進行文本替換工作。與常使用的互動式編輯器(如vim)不同,sed 編輯器以批處理的方式來編輯文件,這比互動式編輯器快得多,可以快速完成對數據的編輯修改。 一般來說,sed 編輯器會執行以下操作: 1)一次從輸入中讀取一行數 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...