Linux:Shell環境變量與命令行參數

目錄

Shell的變量功能

什么是變量

變數的可變性與方便性

影響bash環境操作的變量

腳本程序設計(shell script)的好幫手

變量的使用:echo

變量的使用:HOME?

環境變量相關命令

獲取環境變量?

環境變量和本地變量?

命令行參數?

什么是命令行參數

命令行參數有什么用?

環境變量與命令行參數?


Shell的變量功能

????????變量是 bash 環境中非常重要的一個玩意兒,我們知道 Linux 是多人多任務的環境,每個人登錄系統都能取得一個 bash shell, 每個人都能夠使用 bash 執行?mail 這個命令來接收『自己』的郵件等。問題是,bash是如何得知你的郵箱是哪一個文件?這就需要變量的幫助。所以,你說變量重要不重要?下面我將介紹重要的環境變量、變量的使用與設置等數據。

什么是變量

????????那么,什么是『變量』呢?簡單的說,就是讓某一個特定字符串代表不固定的內容就是了。舉個大家在中學都會學到的數學例子, 那就是:『 y = ax + b 』這東西,在等號左邊的 (y) 就是變量,在等號右邊的(ax+b) 就是變量內容。 要注意的是,左邊是未知數,右邊是已知數喔! 講的更簡單一點,我們可以『用一個簡單的 " 字眼 " 來取代另一個比較復雜或者是容易變動的數據』。這有什么好處啊?最大的好處就是『方便!』。

變數的可變性與方便性

????????舉例來說,我們每個賬號的郵件信箱預設是以 MAIL 這個變量來進行存取的, 當 dmtsai 這個使用者登入時,他便會取得 MAIL 這個變量,而這個變量的內容其實就是 /var/spool/mail/dmtsai , 那如果vbird 登入呢?他取得的 MAIL 這個變量的內容其實就是 /var/spool/mail/vbird 。 而我們使用信件讀取指令 mail 來讀取自己的郵件信箱時,這支程序可以直接讀取 MAIL 這個變量的內容, 就能夠自動的分辨出屬于自己的信箱信件啰!這樣一來,設計程序的程序員就真的很方便!

????????如上圖所示,由于系統已經幫我們規劃好 MAIL 這個變量,所以用戶只要知道 mail 這個指令如何使用即可, mail 會主動的取用 MAIL 這個變量,就能夠如上圖所示的取得自己的郵件信箱了! ( 注意大小寫,小寫的 mail 是指令, 大寫的 MAIL 則是變量名稱喔! )
????????那么使用變量真的比較好嗎?這是當然的!想象一個例子,如果 mail 這個指令將 root 收信的郵件信箱(mailbox) 檔名為 /var/spool/mail/root 直接寫入程序代碼中。那么當 dmtsai 要使用 mail 時,將會取得 /var/spool/mail/root 這個檔案的內容! 不合理吧!所以你就需要幫 dmtsai 也設計一個 mail 的程序,將 /var/spool/mail/dmtsai 寫死到 mail 的程序代碼當中! 天吶!那系統要有多少個 mail 指令啊?反過來說,使用變量就變的很簡單了!因為你不需要更動到程序代碼啊! 只要將 MAIL 這個變量帶入不同的內容即可讓所有使用者透過 mail 取得自己的信件!當然簡單多了!

影響bash環境操作的變量

????????某些特定變量會影響到 bash 的環境!舉例來說,我們前面已經提到過很多次的那個 PATH 變量! 你能不能在任何目錄下執行某個指令,與 PATH 這個變量有很大的關系。例如你下達 ls 這個指令時,系統就是透過 PATH 這個變量里面的內容所記錄的路徑順序來搜尋指令的呢!如果在搜尋完 PATH 變量內的路徑還找不到 ls 這個指令時, 就會在屏幕上顯示『 command not found 』的錯誤信息。
????????如果說的專業一點,那么由于在 Linux System 下面,所有的線程都是需要一個執行碼, 而就如同上面提到的,你『真正以 shell 來跟 Linux 溝通,是在正確的登入 Linux 之后!』這個時候你就有一個 bash 的執行程序,也才可以真正的經由 bash 來跟系統溝通!而在進入 shell 之前,也正如同上面提到的,由于系統需要一些變量來提供他數據的讀寫?(或者是一些環境的設置參數值,例如是否要顯示彩色等) ,所以就有一些所謂的 『環境變量』 需要來讀入系統中了!這些環境變量例如 PATH、HOME、MAIL、SHELL 等等,都是很重要的, 為了區別與自定義變量的不同,環境變量通常以大寫字符來表示!

腳本程序設計(shell script)的好幫手

????????這些還都只是系統默認的變量的目的,如果是個人的設定方面的應用呢:例如你要寫一個大型的 script 時,有些數據因為可能由于用戶習慣的不同而有差異,比如說路徑好了,由于該路徑在 script 被使用在相當多的地方,如果下次換了一部主機,都要修改 script 里面的所有路徑,那么我一定會瘋掉! 這個時候如果使用變量,而將該變量的定義寫在最前面,后面相關的路徑名稱都以變量來取代, 嘿嘿!那么你只要修改一行就等于修改整篇 script 了!方便的很!所以,良好的程序設計師都會善用變量的定義!

????????最后我們就簡單的對『什么是變量』作個簡單定義好了: 『變量就是以一組文字或符號等,來取代一些設定或者是一串保留的數據!』, 例如:我設定了『myname』就是『 VBird 』,所以當你讀取 myname 這個變量的時候,系統自然就會知道!那就是 VBird ! 那么如何『顯示變量』呢?這就需要使用到 echo 這個指令!
????????說的口沫橫飛的,也不知道『變量』與『變量代表的內容』有啥關系? 那我們就將『變量』的『內容』拿出來給您看看。你可以利用 echo 這個指令來取用變量, 但是,變量在被取用時,前面必須要加上錢字號『 $ 』才行,舉例來說,要知道 PATH 的內容,該如何是好?

變量的使用:echo

我們這里單純是拿 echo 來讀出變量的內容而已,更多的 echo 使用,執行指令 man echo 吧
[root@www ~]# echo $variable
[root@www ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@www ~]# echo ${PATH}----------------------------------------------------------------------[root@www ~]# echo $myname<==這里幵沒有任何數據~因為這個變量尚未被設置!是空的!
[root@www ~]# myname=VBird
[root@www ~]# echo $myname
VBird        <==出現了!因為這個發量已經被設定了!

?若該變量需要擴增變量內容時,則可用 "$變量名稱" ${變} 累加內容,如下所示:

『PATH="$PATH":/home/bin』

我們知道執行一個程序時,是需要./mytest 的,但下面這樣設置之后,直接mytest,不用帶 ./ ,當前路徑該程序就可以直接運行。

  • 方法 1:把 proc 拷貝到環境變量 PATH 指定的任一路徑下。
  • 方法 2:把 proc 所在路徑添加到環境變量 PATH 中。(注意:自己添加的環境變量,系統重啟后是不會被保存的)
$ PATH=$PATH:/home/ll/xxx/10# :冒號是分隔符
# 注意:PATH=/home/ll/xxx/10,不能這樣寫,必須加上$符號,否則會把PATH中所有內容覆蓋掉

?效果圖:

變量的使用:HOME?

????????分別在 root 和普通用戶下執行 cd ~ 和 pwd 查看家目錄,分別是 /root?和 /home/test,為什么得到的結果不一樣呢?因為不同用戶的家目錄中的配置文件不一樣,所以不同用戶下的環境變量 HOME 也是不一樣的。

[root@VM-0-12-centos ~]$ echo $HOME
/root
[test@VM-0-12-centos ~]$ echo $HOME # 指定用戶的主工作目錄
/home/test

環境變量相關命令

  1. echo:顯示某個環境變量值。
  2. export:設置一個新的環境變量。
  3. env:顯示所有環境變量。
  4. unset:清除環境變量。
  5. set:顯示本地定義的 shell 變量和環境變量。

獲取環境變量?

getenv?和?setenv?函數介紹:

#include <stdlib.h>char *getenv(const char *name); // 獲取環境變量
int setenv(const char *name, const char *value, int overwrite); // 更改或添加環境變量name:環境變量的名稱
返回值:環境變量的內容
// proc.c
#include <stdio.h>
#include <stdlib.h> // getenvint main()
{printf("%s\n", getenv("PATH"));printf("%s\n", getenv("HOME"));printf("%s\n", getenv("SHELL"));return 0;
}

代碼通過?getenv?函數讀取了?PATHHOMESHELL?等環境變量。這些變量的值繼承自父進程(即啟動該程序的進程)。

  • 在命令行運行?./proc.c?時,父進程是 bash
  • bash 在啟動時會加載自己的環境變量(例如從?~/.bashrc),并在創建子進程(你的程序)時將這些變量傳遞給子進程。

當你在 bash 中輸入命令時(如?ls?或?./a.out),bash 的典型行為是:

  1. fork():創建一個子進程(復制父進程 bash 的環境變量、內存狀態等)。
  2. exec():在子進程中替換為新的程序(如?ls?或?./a.out)。
  3. 環境變量繼承:子進程通過繼承機制獲得父進程(bash)的環境變量。

因此,你的程序中通過?getenv?讀取到的環境變量,實際上是父進程 bash 傳遞下來的。那么就很好的引出了環境變量和本地變量的區別,具體請看如下。

環境變量和本地變量?

環境變量(環境變量通常具有全局屬性:可以被子進程繼承下去)。環境變量實際上是在當前 bash 的上下文中定義的。所以在當前命令行解釋器 bash 內可以被訪問到,在 bash 創建的子進程內也可以被訪問到。

#include <stdio.h>
#include <stdlib.h>int main()
{char* env = getenv("MYENV");if(env){printf("%s\n", env);}return 0;
}

直接運行發現沒有結果,說明該環境變量根本不存在。

  • 導出環境變量:export MYENV="hello world"
  • 再次運行程序,發現有結果了。說明:環境變量是可以被子進程繼承下去的。

本地變量(只能在當前 shell 命令行解釋器內被訪問,不可以被子進程繼承)

[ll@VM-0-12-centos 10]$ MY_VAL="hello world"  # 定義本地變量(在bash內定義的)

?如何查看本地變量呢?

[ll@VM-0-12-centos 10]$ echo $MY_VAL  # 在當前命令行解釋器bash內訪問本地變量
hello world

如何證明本地變量不能被子進程繼承??

// proc.c
#include <stdio.h>
#include <stdlib.h> // getenvint main()
{printf("%s\n", getenv("MY_VAL"));return 0;
}

該怎么解決這個問題呢?可以將本地變量?MY_VAL 設置成環境變量。

[ll@VM-0-12-centos 10]$ exprot MY_VAL  # 把本地變量MY_VAL導出成環境變量

上面說到,我們在命令行上運行的大部分命令,都是 bash 創建子進程來執行的,而本地變量不能被子進程繼承,那為什么使用 echo 命令,卻可以訪問本地變量呢??

在Linux中的命令分類:

# 將PATH變量設置為空
[test@VM-16-11-centos ~]$ export PATH=""
# 以下命令均不能使用
[test@VM-16-11-centos ~]$ ll
-bash: ls: No such file or directory
[test@VM-16-11-centos ~]$ touch
-bash: touch: No such file or directory
[test@VM-16-11-centos ~]$ mkdir
-bash: mkdir: No such file or directory
# pwd仍然可以使用
[test@VM-16-11-centos ~]$ pwd
/home/test
  • 常規命令:shell通過fork讓子進程執行的
  • 內建命令:shell命令行的一個函數,可以直接讀取shell內部定義的本地變量

而在上面的測試中,像ls,mkdir這樣的命令,都是shell通過fork創建子進程來執行的,而這里的PATH路徑已經被用戶破壞了,因此找不到搜索的路徑,因此找不見是當然的事,但是為什么pwd可以找到?這是由于pwd這樣的命令是內建命令,這是shell命令行的一個函數,可以直接讀取shell內部的本地變量,因此就可以找到對應的值進行輸出了。

會提供一個environ指針,這個指針會指向一張環境表,環境表是一個字符指針數組,每一個指針都會有一個字符串。

命令行參數?

什么是命令行參數

在學習C語言中,對于main函數當初的寫法是沒有任何參數的,但是實際上,main函數是可以有參數的,比如下面的寫法:

#include <stdio.h>int main(int argc, char* argv[])
{int i = 0;for (i = 0; i < argc; i++){printf("%d:%s\n", i, argv[i]);}return 0;
}

運行結果:

[test@VM-16-11-centos 10_15]$ vim myproc.c
[test@VM-16-11-centos 10_15]$ make
gcc -o myproc myproc.c
[test@VM-16-11-centos 10_15]$ ./myproc 
0:./myproc

其實,命令行參數是用來支持各種指令級別的命令行選項的設置,例如這里的argv數組中,存儲的字符串其實就是用戶寫的命令,而如果現在我在運行程序的時候帶上選項 :

[test@VM-16-11-centos 10_15]$ ./myproc -a -b -c -d
0:./myproc
1:-a
2:-b
3:-c
4:-d

所以推出:?

int main(int argc, char *argv[]) {// argc 表示參數總數(包括程序名本身)// argv[0] 是程序名,argv[1] 是第一個參數,依此類推
}

????????并且運行結果發現打印的信息就是以用戶寫的指令開始進行分割,然后把信息放到數組中,從中其實看出,用戶在運行程序的時候寫的命令或者是帶的選項都可以被main函數讀取并且傳參,函數體內部就可以利用這個機制實現不同的選項帶來的結果。比如,Linux中有ls命令,用來查看文件夾中的內容,如果使用的是ls -a或者是ls -l這些選項,就會產生不同的結果,實際上這樣的結果也是通過這個原理,通過讀取argv數組中的內容就可以實現各種目的。?

示例:ls?命令的選項實現邏輯

// 偽代碼示意
#include<stdio.h>
#define SHOW_HIDDEN (1 << 0) // 二進制 0b01
#define LONG_FORMAT (1 << 1) // 二進制 0b10int main(int argc, char *argv[]) {int options = 0; // 初始化選項標志位for (int i = 1; i < argc; i++) {if (strcmp(argv[i], "-a") == 0) {options |= SHOW_HIDDEN; // 設置顯示隱藏文件標志} else if (strcmp(argv[i], "-l") == 0) {options |= LONG_FORMAT; // 設置長格式輸出標志}}// 根據 options 執行相應邏輯list_directory(".", options);return 0;
}
$ ./program
運行結果:file1.txt  file2.txt  dir1$ ./program -a
運行結果:.  ..  .hidden_file  file1.txt  file2.txt  dir1$ ./program -l
運行結果:
-rw-r--r-- 1 user group  1024 Jan 1 10:00 file1.txt
drwxr-xr-x 2 user group  4096 Jan 1 10:00 dir1$ ./program -a -l
運行結果:
drwxr-xr-x 2 user group  4096 Jan 1 10:00 .
drwxr-xr-x 5 user group  4096 Jan 1 10:00 ..
-rw-r--r-- 1 user group     0 Jan 1 10:00 .hidden_file
-rw-r--r-- 1 user group  1024 Jan 1 10:00 file1.txt
drwxr-xr-x 2 user group  4096 Jan 1 10:00 dir1$ ./program -x
運行結果:
file1.txt  file2.txt  dir1
  • 無參數:默認行為(不顯示隱藏文件,短格式)。
  • -a:顯示隱藏文件。
  • -l:長格式顯示文件元數據。
  • -a -l:同時啟用兩種模式。
  • 無效參數:被忽略,按默認模式運行。

命令行參數有什么用?

為什么要存在命令行參數呢?

幫助我們能夠給同一個程序,設計出不同的業務功能。

舉個小例子,比如我想要實現這樣一個計算器:
如果輸入 ./cal,則會提示該程序的正確用法:Usage:./cal -[a|s] x y;

輸入 ./cal -a 1 2,cal 程序可以輸出 1 + 2 的結果;

輸入 ./cal -s 4 2,cal 程序可以輸出 4 - 2 的結果。

#include <stdio.h>
#include <stdlib.h> // atoi -- 函數原型:int atoi(const char *nptr); // 將C字符串轉換成整數
#include <string.h> // strcmp// cal命令的用法手冊
void Usage(const char* cal)
{printf("Usage: %s -[a|s] x y\n", cal);
}int main(int argc, char* argv[]) // 接收命令行參數
{// 輸入的參數個數不為4if (argc != 4){Usage(argv[0]);return 1; // 退出程序}// 保存第3個和第4個參數                                                      int x = atoi(argv[2]);int y = atoi(argv[3]);// 根據不同參數,執行不同功能,然后輸出結果if (strcmp(argv[1], "-a") == 0){                                            printf("%d + %d = %d\n", x, y, x + y); }else if (strcmp(argv[1], "-s") == 0){printf("%d - %d = %d\n", x, y, x - y); }else{Usage(argv[0]);return 1; // 退出程序}return 0;
}

運行結果:?

[test@VM-0-12-centos 10]$ ./cal        # 命令使用手冊
Usage: ./cal -[a|s] x y
[test@VM-0-12-centos 10]$ ./cal -a 1 2 # 實現加法
1 + 2 = 3
[test@VM-0-12-centos 10]$ ./cal -s 4 2 # 實現減法
4 - 2 = 2

環境變量與命令行參數?

main 函數除了可以傳遞兩個和命令行參數相關的參數 argc 和 argv 以外,還可以傳遞第 3 個參數?env

int main(int argc, char* argv[], char* env[]);

這也是 main 函數獲取環境變量的方式。通過給 main 函數第三個參數傳參,把一個個環境變量傳遞給當前程序,當前程序運行起來變成進程,就意味著當前這個進程獲取到了這些環境變量。

每個被 bash 創建的子進程都會接收到一張環境表,環境表是一個字符指針數組,每個指針指向一個以?’\0’?結尾的環境字符串(環境變量)。

// proc.c
#include <stdio.h>
#include <string.h>int main(int argc, char* argv[], char* env[]) // 通過第三個參數接收環境變量
{for (int i = 0; env[i]; i++) // 循環結束條件為env[i],遍歷到NULL停止{printf("env[%d]: %s\n", i, env[i]); // 遍歷字符指針數組env}return 0;
}

運行結果:獲取到了當前 bash 內的所有環境變量。(因為環境變量被 bash 創建的子進程 proc 繼承下去了)

所以現在知道 C 庫函數 getenv 的實現原理了,比如?printf("%s\n", getenv("PATH"));,其實就是通過在字符指針數組 env 中進行字符匹配,找到 "PATH" 后面的內容并返回。?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/72078.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/72078.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/72078.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL數據庫入門到大蛇尚硅谷宋紅康老師筆記 高級篇 part 5

第05章_存儲引擎 為了管理方便&#xff0c;人們把連接管理、查詢緩存、語法解析、查詢優化這些并不涉及真實數據存儲的功能劃分為MySQLserver的功能&#xff0c;把真實存取數據的功能劃分為存儲引擎的功能。所t以在MySQLserver完成了查詢優化后&#xff0c;只需按照生成的執行…

JAVA面試_進階部分_23種設計模式總結

1. 單例模式&#xff1a;確保某一個類只有一個實例&#xff0c;而且自行實例化并向整個系統提供這 個實例。 &#xff08;1&#xff09;懶漢式 public class Singleton { /* 持有私有靜態實例&#xff0c;防止被引用&#xff0c;此處賦值為null&#xff0c;目的是實現延遲加載…

滲透測試(WAF過濾information_schema庫的繞過,sqllib-46關,海洋cms9版本的注入)

1.sqlin-lib 46關 打開網站配置文件發現 此網站的對ID進行了排序&#xff0c;我們可以知道&#xff0c;order by接不了union &#xff0c;那我們可以通過測試sort&#xff0c;rond等函數&#xff0c;觀察網頁的反饋來判斷我們的盲注是否正確 我們發現 當參數有sort來排序時&…

AORO M6北斗短報文終端:將“太空黑科技”轉化為安全保障

在衛星導航領域&#xff0c;北斗系統作為我國自主研發的全球衛星導航系統&#xff0c;正以其獨特的短報文通信功能引發全球范圍內的廣泛關注。這一突破性技術不僅使北斗系統在全球四大導航系統中獨樹一幟&#xff0c;具備了雙向通信能力&#xff0c;更通過遨游通訊推出的AORO M…

ARCGIS國土超級工具集1.4更新說明

ARCGIS國土超級工具集V1.4版本&#xff0c;功能已增加至54 個。本次更新在V1.3版本的基礎上&#xff0c;新增了“拓撲問題修復工具”并同時調整了數據處理工具欄的布局、工具操作界面的選擇圖層下拉框新增可選擇位于圖層組內的要素圖層功能、數據保存路徑新增了可選擇數據庫內的…

Element Plus中el-select選擇器的下拉選項列表的樣式設置

el-select選擇器&#xff0c;默認樣式效果&#xff1a; 通過 * { margin: 0; padding: 0; } 去掉內外邊距后的樣式效果&#xff08;樣式變丑了&#xff09;&#xff1a; 通過 popper-class 自定義類名修改下拉選項列表樣式 el-select 標簽設置 popper-class"custom-se…

基于Linux系統的物聯網智能終端

背景 產品研發和項目研發有什么區別&#xff1f;一個令人發指的問題&#xff0c;剛開始工作時項目開發居多&#xff0c;認為項目開發和產品開發區別不大&#xff0c;待后來隨著自身能力的提升&#xff0c;逐步感到要開發一個好產品還是比較難的&#xff0c;我認為項目開發的目的…

java excel xlsx 增加數據驗證

隱藏表下拉框 // 創建隱藏工作表存儲下拉框數據String hiddenSheetName "HiddenSheet"System.currentTimeMillis();Sheet hiddenSheet workbook.createSheet(hiddenSheetName);//設置隱藏sheetworkbook.setSheetHidden(workbook.getSheetIndex(hiddenSheetName), …

linux中安裝部署Jenkins,成功構建springboot項目詳細教程

參考別人配置Jenkins的git地址為https&#xff0c;無法連上github拉取項目&#xff0c;所以本章節介紹通過配置SSH地址來連github拉取項目 目錄&#xff1a; 1、springboot項目 1.1 創建名為springcloudproject的springboot項目工程 1.2 已將工程上傳到github中&#xff0c;g…

提升數據洞察力:五款報表軟件助力企業智能決策

概述 隨著數據量的激增和企業對決策支持需求的提升&#xff0c;報表軟件已經成為現代企業管理中不可或缺的工具。這些軟件能夠幫助企業高效處理數據、生成報告&#xff0c;并將數據可視化&#xff0c;從而推動更智能的決策過程。 1. 山海鯨報表 概述&#xff1a; 山海鯨報表…

MySQL中replace函數用法

語法&#xff1a;replace(field,search,replace) 說明&#xff1a;field - 數據庫表的列名 search - 需要替換的字符串 replace - 替換成的字符串 語義&#xff1a;將列名&#xff1a;field 中出現的search字符串&#xff0c;全部替換成replace字符串。 例子&#xff1a; …

Wireshark Lua 插件教程

本?主要介紹 Lua 腳本在 Wireshark 中的應?, Lua 腳本可以在 Wireshark 中完成如下功能: 從?絡包中提取數據, 或者統計?些數據包(Dumper) 需要解析?種 Wireshark 不提供原??持的協議(Dissector) ?例 協議解析 VREP 協議是 NOGD 框架對于 TRIP 協議的?種延伸和擴展…

吐血整理:在 Docker 中運行 Milvus

直接用docker 錯誤命令&#xff08;這個我試了三遍&#xff0c;浪費了很多時間&#xff09;&#xff1a; docker run -d --name milvus -p 19530:19530 -p 9091:9091 -v /var/lib/milvus:/var/lib/milvus milvusdb/milvus:latest 先看報錯&#xff1a; 2025-02-24 16:02:39 …

【uniapp】在UniApp中實現持久化存儲:安卓--生成寫入數據為jsontxt

在移動應用開發中&#xff0c;數據存儲是一個至關重要的環節。對于使用UniApp開發的Android應用來說&#xff0c;緩存&#xff08;Cache&#xff09;是一種常見的數據存儲方式&#xff0c;它能夠提高應用的性能和用戶體驗。然而&#xff0c;緩存數據在用戶清除緩存或清除應用數…

【Excel】 Power Query抓取多頁數據導入到Excel

抓取多頁數據想必大多數人都會&#xff0c;只要會點編程技項的人都不會是難事兒。那么&#xff0c;如果只是單純的利用Excel軟件&#xff0c;我還真的沒弄過。昨天&#xff0c;我就因為這個在網上找了好久發好久。 1、在數據-》新建查詢-》從其他源-》自網站 &#xff0c;如圖 …

星環科技推出DeepSeek全場景解決方案:即開即用、企業級部署、端側智能三位一體

星環科技&#xff08;688031.SH&#xff09;正式發布DeepSeek全場景解決方案&#xff0c;全面覆蓋個人用戶、企業客戶及行業場景需求&#xff0c;為用戶提供從個人到企業、從云端到本地的全方位AI應用支持&#xff0c;為不同需求的用戶提供了靈活、高效且安全的AI解決方案。 省…

let、const【ES6】

?“我唯一知道的就是我一無所知。” - 蘇格拉底 目錄 塊級作用域&#xff1a;var、let、const的對比&#xff1a;Object.freeze()&#xff1a; 塊級作用域&#xff1a; 塊級作用域指由 {} 包圍的代碼塊&#xff08;如 if、for、while、單獨代碼塊等&#xff09;形成的獨立作用…

C++ 常見面試知識點

主要介紹C常見面試題 1、說一下你理解的C中的四種智能指針 常用接口 T* get(); T& operator*(); T* operator->(); T& operator(const T& val); T* release(); 將 封裝在內部的指針置為nullptr, 但并不會破壞指針所指向的內容, 函 數返回的是內部指針置空之前…

AWS API Gateway灰度驗證實現

在微服務架構中,灰度發布(金絲雀發布)是驗證新版本穩定性的核心手段。通過將小部分流量(如 10%)導向新版本服務,可以在不影響整體系統的情況下快速發現問題。AWS API Gateway 原生支持流量按比例分配功能,無需復雜編碼即可實現灰度驗證。本文將詳細解析其實現方法、最佳…

基于coze+微信小程序實現圖片上傳并利用大模型解析

項目截圖&#xff1a; 實現代碼&#xff08;直接搬去可用&#xff09; 前提&#xff1a;需要填寫你的oss配置coze的api授權配置&#xff01;&#xff01;&#xff01; <template><view class"container"><!-- 高斯模糊背景 --><view class&qu…