Shell編程基礎篇-上

来源:http://www.cnblogs.com/clsn/archive/2017/12/06/7992981.html
-Advertisement-
Play Games

腳本書寫規範、shell腳本的執行方式、Shell中的變數說明、變數子串、shell中的數學運算 ...


1.1 前言

1.1.1 為什麼學Shell

Shell腳本語言是實現Linux/UNIX系統管理及自動化運維所必備的重要工具, Linux/UNIX系統的底層及基礎應用軟體的核心大都涉及Shell腳本的內容。每一個合格 Linux系統管理員或運維工程師,都需要能夠熟練地編寫Shell腳本語言,並能夠閱 讀系統及各類軟體附帶的Shell腳本內容。只有這樣才能提升運維人員的工作效率,適 應曰益複雜的工作環境,減少不必要的重覆工作,從而為個人的職場發展奠定較好的基礎

1.1.2 什麼是shell

Shell是一個命令解釋器,它在操作系統的最外層,負責直接與用戶對話,把用戶的輸入解釋給操作系統,並處理各種各樣的操作系統的輸出結果,輸出屏幕返回給用戶。

這種對話方式可以是:

交互的方式:從鍵盤輸入命令,通過/bin/bash的解析,可以立即得到Shell的回應

[root@clsn ~]# ls            
anaconda-ks.cfg  
[root@clsn ~]# echo ls |bash 
anaconda-ks.cfg   

非交互的方式: 腳本

1.1.3 什麼是Shell腳本

  命令、變數和流程式控制制語句等有機的結合起來

         shell腳本擅長處理純文本類型的數據,而linux中,幾乎所有的配置文件,日誌,都是純文本類型文件

1.1.4 腳本語言的種類

一、編譯型語言

定義:指用專用的編譯器,針對特定的操作平臺(操作系統)將某種高級語言源代碼一次性翻譯成可被硬體平臺直接運行的二進位機器碼(具有操作數,指令、及相應的格式),這個過程叫做編譯(./configure  make makeinstall );編譯好的可執行性文件(.exe),可在相對應的平臺上運行(移植性差,但運行效率高)。。

典型的編譯型語言有, C語言、C++等。

另外,Java語言是一門很特殊的語言,Java程式需要進行編譯步驟,但並不會生成特定平臺的二進位機器碼,它編譯後生成的是一種與平臺無關的位元組碼文件(*.class)(移植性好的原因),這種位元組碼自然不能被平臺直接執行,運行時需要由解釋器解釋成相應平臺的二進位機器碼文件;大多數人認為Java是一種編譯型語言,但我們說Java即是編譯型語言,也是解釋型語言也並沒有錯。

二、解釋型語言

定義:指用專門解釋器對源程式逐行解釋成特定平臺的機器碼並立即執行的語言;相當於把編譯型語言的編譯鏈接過程混到一起同時完成的。

解釋型語言執行效率較低,且不能脫離解釋器運行,但它的跨平臺型比較容易,只需提供特定解釋器即可。

常見的解釋型語言有, Python(同時是腳本語言)與Ruby等。

三、腳本語言

定義:為了縮短傳統的編寫-編譯-鏈接-運行(edit-compile-link-run)過程而創建的電腦編程語言。

特點:程式代碼即是最終的執行文件,只是這個過程需要解釋器的參與,所以說腳本語言與解釋型語言有很大的聯繫。腳本語言通常是被解釋執行的,而且程式是文本文件。

典型的腳本語言有,JavaScriptPythonshell等。

其他常用的腳本語句種類

PHP是網頁程式,也是腳本語言。是一款更專註於web頁面開發(前端展示)的腳本語言,例如:Dedecms,discuzPHP程式也可以處理系統日誌,配置文件等,php也可以調用系統命令。

Perl腳本語言。比shell腳本強大很多,語法靈活、複雜,實現方式很多,不易讀,團隊協作困難,但仍不失為很好的腳本語言,存世大量的程式軟體。MHA高可用Perl寫的

Python,不但可以做腳本程式開發,也可以實現web程式以及軟體的開發。近兩年越來越多的公司都會要求會Python

Shell腳本與php/perl/python語言的區別和優勢?

shell腳本的優勢在於處理操作系統底層的業務 linux系統內部的應用都是shell腳本完成)因為有大量的linux系統命令為它做支撐。2000多個命令都是shell腳本編程的有力支撐,特別是grepawksed等。例如:一鍵軟體安裝、優化、監控報警腳本,常規的業務應用,shell開發更簡單快速,符合運維的簡單、易用、高效原則.

  PHPPython優勢在於開發運維工具以及web界面的管理工具,web業務的開發等。處理一鍵軟體安裝、優化,報警腳本。常規業務的應用等php/python也是能夠做到的。但是開發效率和複雜比用shell就差很多了。

系統環境說明

[root@clsn scripts]# cat /etc/redhat-release 
CentOS Linux release 7.4.1708 (Core) 
[root@clsn scripts]# uname -r
3.10.0-693.el7.x86_64
[root@clsn scripts]# getenforce 
Disabled
[root@clsn scripts]# systemctl status firewalld.service 
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)

1.1.5 系統中的shell

查看系統中的命解釋器

[root@clsn ~]# cat /etc/shells 
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin

常用操作系統的預設shell

1.LinuxBourne Again shellbash

2.SolarisFreeBSD預設的是Bourne shellsh

3.AIX下是Korn Shellksh

4.HP-UX預設的是POSIX shellsh

[root@clsn ~]# echo $SHELL
/bin/bash

bash版本

[root@clsn scripts]# bash -version
GNU bash, 版本 4.2.46(2)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
許可證 GPLv3+: GNU GPL 許可證版本3或者更高 <http://gnu.org/licenses/gpl.html>

這是自由軟體,您可以自由地更改和重新發佈。
在法律允許的範圍內沒有擔保. 

bash 破殼漏洞

使用 命令 env x='() { :;}; echo be careful' bash -c "echo this is a test"
如果返回結果為一行,則為正常,
 [root@clsn ~]# env x='() { :;}; echo be careful' bash -c "echo this is a test"
 this is a test
 
#解決辦法 升級當前的bash版本
 yum install update bash

shbash 的關係

[root@clsn ~]#  ll /bin/sh
lrwxrwxrwx. 1 root root 4 11月 13 11:15 /bin/sh -> bash

/bin /user/bin 的關係

[root@clsn ~]# ll /bin -d
lrwxrwxrwx. 1 root root 7 11月 13 11:15 /bin -> usr/bin

1.2 腳本書寫規範

1.2.1 腳本統一存放目錄

[root@clsn ~]# mkdir -p /server/scripts/
[root@clsn ~]# cd /server/scripts/

1.2.2 選擇解釋器

註意格式

其中開頭的"#!"字元又稱為幻數,在執行bash腳本的時候,內核會根據"#!"後的解釋器來確定該用那個程式解釋這個腳本中的內容。

[root@clsn scripts]# head -1 /etc/init.d/*
==> /etc/init.d/functions <==
# -*-Shell-script-*-

==> /etc/init.d/netconsole <==
#!/bin/bash

==> /etc/init.d/network <==
#! /bin/bash

1.2.3 編輯腳本使用vim

使用 .vimrc 文件,能夠快速的生成開頭的註釋信息

[root@clsn scripts]# cat  ~/.vimrc 
autocmd BufNewFile *.py,*.cc,*.sh,*.java exec ":call SetTitle()"

func SetTitle()
    if expand("%:e") == 'sh'
        call setline(1,"#!/bin/bash")
        call setline(2, "##############################################################")
        call setline(3, "# File Name: ".expand("%"))
        call setline(4, "# Version: V1.0")
        call setline(5, "# Author: clsn")
        call setline(6, "# Organization: http://blog.znix.top")
        call setline(7, "# Created Time : ".strftime("%F %T"))
        call setline(8, "# Description:")
        call setline(9, "##############################################################")
        call setline(10, "")
    endif
endfunc

使用後的效果

[root@clsn scripts]# cat  scripts_test.sh 
#!/bin/bash
##############################################################
# File Name: scripts_test.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-04 11:39:57
# Description:  First scripts file
##############################################################

Shell腳本中,跟在#後面的內容表示註釋。註釋部分不會被執行,僅給人看。註釋可以自成一行,也可以跟在命令後面,與命令同行。要養成寫註釋的習慣,方便自己與他人。

最好不用中文註釋,因為在不同字元集的系統會出現亂碼(字元集為zh_CN.UTF-8,為中文)

1.2.4 文件名規範

         名字要有意義,並且結尾以 .sh 結束

1.2.5 開發的規範和習慣小結

1) 放在統一的目錄

2) 腳本以.sh為擴展名

3) 開頭指定腳本解釋器。

4) 開頭加版本版權等信息,可配置~/.vimrc文件自動添加。

5) 腳本不要用中文註釋,儘量用英文註釋。

6) 代碼書寫優秀習慣

  a、成對的內容一次性寫出來,防止遺漏,如[  ]' '" "

  b[  ]兩端要有空格,先輸入[  ],退格,輸入2個空格,再退格寫。

  c、流程式控制制語句一次書寫完,再添加內容。(if 條件 ; then  內容;fi)ddd

  d、通過縮進讓代碼易讀。

  f、腳本中的引號都是英文狀態下的引號,其他字元也是英文狀態。

1.3 shell腳本的執行

1.3.1 執行腳本的辦法

sh/bash   scripts.sh 
chown +x   ./scripts.sh  && ./scripts.sh  
source scripts.sh
. (空格) scripts.sh
cat oldboyedu.sh |bash  # 效率較低

source . (點) 的作用

soucre命令

[root@clsn ~]# help source  |head -2
source: source 文件名 [參數]
    在當前 shell 中執行一個文件中的命令。

. ()

[root@clsn scripts]# help . |head -2
.: . 文件名 [參數]
    在當前 shell 中執行一個文件中的命令。

1.3.2 sh source的區別

[root@clsn scripts]# sh  clsn_test.sh 
Hello World!
[root@clsn scripts]# echo $clsn
#  sh  新建一個Shell視窗(新建一個進程)執行一個文件中的命令。

[root@clsn scripts]# source clsn_test.sh 
Hello World!
[root@clsn scripts]# echo $clsn
Hello World!

面試題:

sh test.shecho $user返回的結果___ ?

[root@oldboy scripts]# cat test.sh 
#!/bin/bash
user=`whoami`

1.4 Shell的變數

1.4.1 什麼是變數

變數可以分為兩類:環境變數(全局變數)和普通變數(局部變數)

  環境變數也可稱為全局變數,可以在創建他們的Shell及其派生出來的任意子進程shell中使用,環境變數又可分為自定義環境變數和Bash內置的環境變數

  普通變數也可稱為局部變數,只能在創建他們的Shell函數或Shell腳本中使用。普通變數一般是由開發者用戶開發腳本程式時創建的。

         特殊變數

1.4.2 環境變數

使用 env/declare/set/export -p 命令查看系統中的環境變數,這三個命令的的輸出方式稍有不同。

[root@clsn scripts]# env
XDG_SESSION_ID=1
HOSTNAME=clsn
TERM=linux
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=10.0.0.1 5537 22
SSH_TTY=/dev/pts/0
USER=root
~~~

         輸出一個系統中的 環境變數

[root@clsn ~]# echo $LANG
zh_CN.UTF-8

1.4.3 普通變數

本地變數在用戶當前的Shell生存期的腳本中使用。例如,本地變數OLDBOY取值為bingbing,這個值在用戶當前Shell生存期中有意義。如果在Shell中啟動另一個進程或退出,本地變數值將無效       

定義普通變數實踐

[root@clsn ~]# a=1
[root@clsn ~]# b='2'
[root@clsn ~]# c="3"
[root@clsn ~]# echo "$a"
1
[root@clsn ~]# echo "$b"
2
[root@clsn ~]# echo "${c}"

提示:$變數名錶示輸出變數,可以用$c${c}兩種用法

小結:連續普通字元串內容賦值給變數,不管用什麼引號或者不用引號,它的內容是什麼,列印變數就輸出什麼

1.4.4 export命令

[root@clsn ~]# help export 
export: export [-fn] [名稱[=值] ...] 或 export -p
為 shell 變數設定導出屬性。

標記每個 NAME 名稱為自動導出到後續命令執行的環境。如果提供了 VALUE
則導出前將 VALUE 作為賦值。

export命令的說明

當前shell視窗及子shell視窗生效

在新開的shell視窗不會生效,生效需要寫入配置文件

# 定義變數

[root@clsn scripts]# CSLN=clsn
[root@clsn scripts]# export CSLN1=1

# 當前視窗查看

[root@clsn scripts]# echo $CSLN
clsn
[root@clsn scripts]# echo $CSLN1
1

# 編寫測試腳本

[root@clsn scripts]# vim quanju.sh 
#!/bin/bash
echo $CSLN
echo $CSLN1

# 使用sh執行

[root@clsn scripts]# sh  quanju.sh 

1

# 使用source 執行

[root@clsn scripts]# source quanju.sh 
clsn
1

1.4.5 環境變數相關配置文件

/etc/proflie

/etc/bashrc

~/.bashrc

~/.bash_profile

/etc/proflie.d/  # 目錄

四文件讀取順序(CentOS67都一樣)

/etc/profile

~/.bash_profile

~/.bashrc

/etc/bashrc

文件讀取過程示意圖

驗證四文件讀取順序的方法

sed -i '1a echo "$(date +%T-%s) /etc/profile1" >>/tmp/clsn' /etc/profile
sed -i '$a echo "$(date +%T-%s) /etc/profile2" >>/tmp/clsn' /etc/profile
sed -i '1a echo "$(date +%T-%s) /etc/bashrc1" >>/tmp/clsn' /etc/bashrc
sed -i '$a echo "$(date +%T-%s) /etc/bashrc2" >>/tmp/clsn' /etc/bashrc
sed -i '1a echo "$(date +%T-%s) ~/.bashrc1" >>/tmp/clsn' ~/.bashrc
sed -i '$a echo "$(date +%T-%s) ~/.bashrc2" >>/tmp/clsn' ~/.bashrc
sed -i '1a echo "$(date +%T-%s) ~/.bash_profile1" >>/tmp/clsn' ~/.bash_profile
sed -i '$a echo "$(date +%T-%s) ~/.bash_profile2" >>/tmp/clsn' ~/.bash_profile

1.4.6 環境變數的知識小結

ü 變數名通常要大寫。

ü 變數可以在自身的Shell及子Shell中使用。

ü 常用export來定義環境變數。

ü 執行env預設可以顯示所有的環境變數名稱及對應的值。

ü 輸出時用“$變數名”,取消時用“unset變數名”。

ü 書寫crond定時任務時要註意,腳本要用到的環境變數最好先在所執行的Shell腳本中重新定義。

ü 如果希望環境變數永久生效,則可以將其放在用戶環境變數文件或全局環境變數文件里。

1.4.7 變數中引號的使用

只有在變數的值中有空格的時候,會使用引號。

單引號與雙引號的區別在於,是否能夠解析特殊符號。

[root@clsn ~]# name=znix
[root@clsn ~]# name2='clsn'
[root@clsn ~]# name3="http://blog.znix.top"
[root@clsn ~]# echo $name
znix
[root@clsn ~]# echo $name2
clsn
[root@clsn ~]# echo $name3
http://blog.znix.top
[root@clsn ~]# name4='cl sn'
[root@clsn ~]# echo $name4
cl sn
[root@clsn ~]# name5="cl sn"
[root@clsn ~]# echo $name5
cl sn
[root@clsn ~]# name6='cl sn $PWD'
[root@clsn ~]# echo $name6
cl sn $PWD
[root@clsn ~]# name6="cl sn $PWD"
[root@clsn ~]# echo $name6
cl sn /root

1.4.8 普通變數的要求

1)     內容是純數字、簡單的連續字元(內容中不帶任何空格)時,定義時可以不加任何引號,例如:

a.ClsnAge=22

b.NETWORKING=yes

2)     沒有特殊情況時,字元串一律用雙引號定義賦值,特別是多個字元串中間有空格時,例如:

a.NFSD_MODULE="no load"

b.MyName="Oldboy is a handsome boy."

3)     當變數里的內容需要原樣輸出時,要用單引號(M),這樣的需求極少,例如:

a.OLDBOY_NAME='OLDBOY'

變數使用反引號賦值

[root@clsn scripts]# time=`date`
[root@clsn scripts]# echo $time
2017年 12月 05日 星期二 09:02:06 CST
    
[root@clsn scripts]# file=`ls`
[root@clsn scripts]# echo $file
clsn_test.sh panduan.sh quanju.sh yhk.sh

使用${}

列印變數的時候防止出現“金庸新著”的問題

[root@clsn scripts]# time=`date`
[root@clsn scripts]# echo $time_day

[root@clsn scripts]# echo ${time}_day
2017年 12月 05日 星期二 09:02:06 CST_day
[root@clsn scripts]# echo $time-day
2017年 12月 05日 星期二 09:02:06 CST-day

編寫腳本測試${}

 # 使用腳本測試
 [root@clsn scripts]# vim bianliang.sh 
 #!/bin/bash
 #############################################################
 # File Name: bianliang.sh
 # Version: V1.0
 # Author: clsn
 # Organization: http://blog.znix.top
 # Created Time : 2017-12-05 09:10:29
 # Description:
 #############################################################
    
 time=`date`
 echo $timeday
 echo ${time}day
    
 [root@clsn scripts]# sh  bianliang.sh 
    
 2017年 12月 05日 星期二 09:11:19 CSTday

1.4.9 定義變數名技巧

1. 變數名只能為字母、數字或下劃線,只能以字母或下劃線開頭。

2. 變數名的定義要有一定的規範,並且要見名知意。

示例:

ClsnAge=22       #<==每個單詞的首字母大寫的寫法

clsn_age=22      #<==單詞之間用"_"的寫法

clsnAgeSex=man   #<==駝峰語法:首個單詞的首字母小寫,其餘單詞首字母大寫

CLSNAGE=22       #<==單詞全大寫的寫法

3. 一般的變數定義、賦值常用雙引號;簡單連續的字元串可以不加引號;希望原樣輸出時使用單引號。

4. 希望變數的內容是命令的解析結果時,要用反引號'',或者用$()把命令括起來再賦值。

1.5 特殊變數

1.5.1 位置變數

常用的特殊位置參數說明

位置變數

作用說明

$0

獲取當前執行的shell腳本的文件名,如果執行腳本帶路徑那麼就包括腳本路徑。

$n

獲取當前執行的shell腳本的第n個參數值,n=1..9,當n0時表示腳本的文件名,如果n大於9用大括弧括起來{10},參數以空格隔開。

$#

獲取當前執行的shell腳本後面接的參數的總個數

$*

獲取當前shell的所有傳參的參數,不加引號同$@;如果給$*加上雙引號,例如: $*,則表示將所有的參數視為單個字元串,相當於“$1$2$3”。

$@

獲取當前shell的所有傳參的參數,不加引號同$*;如果給$@加上雙引號,例如: $@,則表示將所有參數視為不同的獨立字元串,相當於“$1 $2 $3 “……”,這是將參數傳遞給其他程式的最佳方式,因為他會保留所有內嵌在每個參數里的任何空白。

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

-Advertisement-
Play Games
更多相關文章
  • 返回總目錄 本小節目錄 Pull Up Field(欄位上移) Pull Up Method(函數上移) Pull Up Constructor Body(構造函數本體上移) 1Pull Up Field(欄位上移) 概要 兩個子類擁有相同的欄位。將該欄位移至基類。 動機 如果各個子類是分別開發的, ...
  • Nginx在WebApi集群,除了OAUTH身份驗證外,針對移動端的手機、平板電腦等,還經常使用Token令牌驗證,通過伺服器授權發出有效期的Token,客戶端通過此Token在當前有效期內,進行訪問獲取信息數據。Token驗證在很多方面都廣泛應用,舉一個實際應用場景:A客戶想通過接收郵件或者簡訊網... ...
  • 1.名詞解釋 (1)協變:父類的對象用子類代替 (2)抗變:子類的對象用父類代替 如方法的參數是協變的,而返回值是抗變的。 2.泛型介面的協變與抗變 (1)協變:IDemo<out T> 》IDemo<out ParentT> 泛型類型T只能作為IDemo中方法或屬性的返回值 (2)抗變:IDemo ...
  • 本節將分析 代碼。 源代碼參考.NET Core 2.0.0 "WebHostBuilder" "WebHost" "Kestrel" 問題概要 1. Hosting中有哪2個ServiceProvider,各自如何創建,以及有哪些ServiceCollection。 1. 什麼時候執行Startu ...
  • ...
  • 前段時間在玩dos命令行的時候,用copy con創建了txt文件後想對其進行編輯,然後我又不想用記事本,所以去網上找命令行中對文本文件進行編輯的命令(純屬想裝B),結果看到了edit命令。 一敲,就出現瞭如下所示問題 告訴我edit不是內部或外部命令,也不是可運行的程式。然後我就懵了,度娘騙我? ...
  • 1.從官網下載source insight4.0版本(不用下載,在後面已經把所有需要的文件都準備好了); 2.安裝source insightt4.0; 3.使用下載好的sourceinsight4.exe替換安裝在program file(x86)目錄下的sourceinsight4.exe; 4 ...
  • Rsync的文件同步實現 一、rsync 簡介 Rsync(remote synchronize)是一個遠程數據同步工具,簡要的概括就是主機於主機之間的文件目錄數據的一個同步。 它的特性如下: 可以鏡像保存整個目錄樹和文件系統。 可以很容易做到保持原來文件的許可權、時間、軟硬鏈接等等。 無須特殊許可權即 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...