Linux之命令行參數(shù)詳解
1.基本概念
在 Linux(及其他類 Unix 系統(tǒng))中,命令行參數(shù)是執(zhí)行命令或程序時(shí),跟隨在命令名稱之后的額外信息。它們的作用是向程序傳遞具體指令、配置選項(xiàng)或操作對象,讓程序根據(jù)參數(shù)的不同執(zhí)行不同的行為。
1.1.參數(shù)的組成
一個(gè)完整的命令行通常由三部分構(gòu)成:
- 命令名稱 [選項(xiàng)] [參數(shù)值]
- 命令名稱:要執(zhí)行的程序(如 ls、cp、grep 等)。
- 選項(xiàng)(Options):用于調(diào)整命令的行為(如是否顯示詳細(xì)信息、是否忽略錯(cuò)誤等)。
- 參數(shù)值(Arguments):命令操作的對象(如文件名、路徑、文本內(nèi)容等)。
例如:
ls -l /home/user #ls 是命令名稱; #-l 是選項(xiàng)(表示 “以詳細(xì)列表形式顯示”); #/home/user 是參數(shù)值(表示要列出的目錄)。
1.2選項(xiàng)(Options)的分類
選項(xiàng)是命令行參數(shù)中最靈活的部分,用于控制命令的細(xì)節(jié)行為,主要分為兩類:
1.2.1 短選項(xiàng)(Short Options)
| 格式 | 以單個(gè)連字符 - 開頭,后跟一個(gè)字母(或數(shù)字)。 |
| 特點(diǎn) | 簡潔,可組合使用。 |
示例:
ls -l:-l 表示 “詳細(xì)列表”; ls -a:-a 表示 “顯示隱藏文件”; ls -la:組合 -l 和 -a,即 “詳細(xì)列表 + 顯示隱藏文件”。
1.2.2 長選項(xiàng)(Long Options)
| 格式 | 以兩個(gè)連字符 -- 開頭,后跟完整單詞(或多個(gè)單詞,用連字符連接)。 |
| 特點(diǎn) | 語義明確,便于理解,通常與短選項(xiàng)功能對應(yīng)。 |
示例:
ls --all:與 -a 功能相同(顯示隱藏文件); ls --format=long:與 -l 功能相同(詳細(xì)列表); rm --force:與 -f 功能相同(強(qiáng)制刪除,不提示)。
1.2.3 帶值的選項(xiàng)
部分選項(xiàng)需要跟隨具體的值(如配置路徑、設(shè)置模式等),短選項(xiàng)和長選項(xiàng)都可能需要:
| 短選項(xiàng) | 值通常緊跟選項(xiàng)(可空格分隔,也可直接拼接)。 |
例如:
grep -i "hello"(-i 表示 “忽略大小寫”,值是要搜索的文本 "hello")。
| 長選項(xiàng) | 值通常用 = 連接(也可用空格)。 |
例如:
ls --color=auto(--color 選項(xiàng)的值為 auto,表示 “自動根據(jù)終端是否支持顏色顯示”)。
1.3參數(shù)值(Arguments)
參數(shù)值是命令直接操作的對象,不需要前綴符號(- 或 --),常見類型包括:
| 參數(shù)值類型 | 描述 | 示例 |
|---|---|---|
| 文件名 | 命令操作的具體文件 | file.txt(如 cat file.txt 中的 file.txt) |
| 目錄路徑 | 命令操作的目錄位置 | /tmp(如 cd /tmp 中的 /tmp) |
| 文本內(nèi)容 | 命令處理的具體文本 | "error"(如 grep "error" log.txt 中的 "error") |
| 數(shù)字 | 命令使用的數(shù)值參數(shù) | 10(如 head -n 10 file.txt 中的 10,表示顯示前 10 行) |
注意:如果參數(shù)值本身以 - 開頭(如文件名 -test.txt),命令可能會誤認(rèn)為是選項(xiàng),此時(shí)需用 -- 分隔選項(xiàng)和參數(shù),例如:
rm -- -test.txt(-- 告訴 rm 后面的內(nèi)容都是參數(shù),不是選項(xiàng))
1.4特殊符號參數(shù)
在命令行中,有一些特殊符號被約定為特定含義的參數(shù):
- -(連字符)
通常代表 “標(biāo)準(zhǔn)輸入(stdin)” 或 “標(biāo)準(zhǔn)輸出(stdout)”,用于命令間的數(shù)據(jù)傳遞。
示例 1:cat -(從鍵盤輸入讀取內(nèi)容,直到按 Ctrl+D 結(jié)束); 示例 2:tar -cvf - /home | gzip > backup.tar.gz(- 表示將 tar 的輸出作為 gzip 的輸入)。
- --(雙連字符)
用于明確分隔選項(xiàng)和參數(shù),避免參數(shù)被誤解析為選項(xiàng)。
如前面提到的: rm -- -test.txt
2.main函數(shù)
在 C/C++ 程序中,main函數(shù)是程序的入口點(diǎn),它可以接收命令行參數(shù),使程序能在啟動時(shí)獲取外部輸入。main函數(shù)的參數(shù)有固定的標(biāo)準(zhǔn)形式,用于處理命令行傳遞的參數(shù)。
main 函數(shù)的參數(shù)形式
- 標(biāo)準(zhǔn)的main函數(shù)參數(shù)聲明如下:
int main(int argc, char *argv[]) {
// 程序邏輯
return 0;
}| 參數(shù) | 類型 | 含義 |
|---|---|---|
| argc | int | 命令行參數(shù)的總個(gè)數(shù)(包含程序名本身) |
| argv | char *[] 或 char ** | 字符串?dāng)?shù)組,存儲具體的命令行參數(shù) |
2.1示例
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
for(int i=0;i<argc;i++)
{
printf("argv[%d]->%s\n",i,argv[i]);
}
return 0;
}
- 運(yùn)行結(jié)果:


想要驗(yàn)證 NULL 可以 修改i<argc成argv[i]
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
for(int i=0;argv[i];i++)//修改i<argc成argv[i]
{
printf("argv[%d]->%s\n",i,argv[i]);
}
return 0;
}
2.3模擬命令
我們來模擬一下ls命令:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
int main(int argc,char *argv[])
{
if(argc!=2)
{
printf("Usage: %s -[a,b,c,d]\n",argv[0]);
}
else if(strcmp(argv[1],"-a")==0)
{
printf("This is fiction 1!\n");
}
else if(strcmp(argv[1],"-b")==0)
{
printf("This is fiction 2!\n");
}
else if(strcmp(argv[1],"-c")==0)
{
printf("This is fiction 3!\n");
}
else if(strcmp(argv[1],"-d")==0)
{
printf("This is fiction 4!\n");
}
else printf("No this fiction\n");
return 0;
}
ls等命令和我們寫的程序一樣,同一個(gè)程序給予不同的參數(shù),執(zhí)行不同的功能。
2.4小結(jié)
命令行中用空格分隔參數(shù),若參數(shù)本身包含空格,需用引號(單引號或雙引號)括起來
- argc的值至少為 1,因?yàn)?span>argv[0]始終存在
- argv數(shù)組中的字符串都是以 null 結(jié)尾的 C 風(fēng)格字符串
- C++ 中還可以使用char **argv形式,與char *argv[ ]等價(jià)
3.參數(shù)化的意義
3.1為什么要有命令行參數(shù)?
本質(zhì):命令行參數(shù)本質(zhì)是交給我們程序的不同的選型,用來定制不同的程序功能。命令中會攜帶很多的選項(xiàng)。
3.2參數(shù)如何傳遞參數(shù)給main函數(shù)的
1.父進(jìn)程的數(shù)據(jù)能被子進(jìn)程看見
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
int g_val = 100000;
int main()
{
printf("I am father process, pid: %d, ppid: %d, g_val: %d\n", getpid(), getppid(), g_val);
sleep(5);
pid_t id = fork();
if (id == 0)
{
// child
while (1)
{
printf("I am child process, pid: %d, ppid: %d, g_val: %d\n", getpid(), getppid(), g_val);
sleep(1);
}
}
else
{
// father
while (1)
{
printf("I am father process, pid: %d, ppid: %d, g_val: %d\n", getpid(), getppid(), g_val);
sleep(1);
}
}
}

2.命令行中啟動的程序都會變成進(jìn)程,其實(shí)都是 bash 的子程序。
- 啟動程序

- vim命令 (本質(zhì)也是一種程序)

- 因此我們得知參數(shù)是由父進(jìn)程 bash 參數(shù)傳遞的。

4.總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
CentoS6.5環(huán)境下redis4.0.1(stable)安裝和主從復(fù)制配置方法
這篇文章主要介紹了CentoS6.5環(huán)境下redis4.0.1(stable)安裝和主從復(fù)制配置方法,結(jié)合實(shí)例形式分析了CentoS6.5下redis4.0.1的安裝和主從復(fù)制配置相關(guān)步驟、命令與操作注意事項(xiàng),需要的朋友可以參考下2018-04-04
linux防墻iptables詳細(xì)介紹、配置方法與案例
這篇文章主要介紹了linux防墻iptables詳細(xì)介紹、配置方法與案例,需要的朋友可以參考下2020-02-02
VMware Workstation Pro下CentOS 7 64位服務(wù)器安裝教程
這篇文章主要介紹了VMware Workstation Pro下CentOS 7 64位服務(wù)器安裝教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
在Apache服務(wù)器中運(yùn)行CGI程序的方法
這篇文章主要介紹了在Apache服務(wù)器中運(yùn)行CGI程序的方法,文中以Perl腳本作為示例,需要的朋友可以參考下2015-07-07
linux里daily_routine實(shí)例代碼詳解
在本篇文章里小編給大家整理的是關(guān)于linux里daily_routine實(shí)例代碼以及相關(guān)知識點(diǎn)內(nèi)容,有需要的朋友們參考下。2019-09-09
Linux服務(wù)器安全需要注意到幾點(diǎn)事項(xiàng)小結(jié)
Linux服務(wù)器安全是個(gè)很重要的問題,這里簡單的總結(jié)下linux服務(wù)器的設(shè)置技巧。2010-08-08
如何修改CentOS服務(wù)器時(shí)間為北京時(shí)間
這篇文章主要介紹了修改CentOS服務(wù)器時(shí)間為北京時(shí)間的相關(guān)知識,非常不錯(cuò),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2018-10-10

