Linux argc,argv詳解


來源:微信公眾號「編程學習基地」

@

argc,argv是什麼

如果你是一個 Linux 開發者,那麼你一定需要給應用程式傳遞參數。

剛接觸C語言的童鞋,學的第一個程式一定是這樣的

#include<stdio.h>
int main()
{
    printf("hello world\n");
}

接觸完 Linux 下C語言編程的童鞋,他會這樣做

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

這個argc,argv有什麼用?,先看下輸出結果

# ./main 
argc:1,argv[0]:./main

我們傳遞一個參數看看

# ./main -v
argc:2,argv[0]:./main

可以大概猜一下,argc跟命令行參數數量有關,argv跟命令行參數有關

修改下程式試著獲取傳遞的參數

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

測試一下效果

# ./main
argc:0, argv[0]:./main
# ./main -p
argc:0, argv[0]:./main
argc:1, argv[1]:-p
# ./main -p 80
argc:0, argv[0]:./main
argc:1, argv[1]:-p
argc:2, argv[2]:80

這次可以確定了,argc是傳遞給應用程式的參數個數,argv是傳遞給應用程式的參數,且第一個參數為程式名。

如何解析程式參數

既然argc,argv可以傳遞參數,那我們如何分析命令行參數?

這裡有個函數給大家介紹下

#include <unistd.h>
int getopt(int argc, char * const argv[],
          const char *optstring);
extern char *optarg;
extern int optind, opterr, optopt;

函數說明:getopt()用來分析命令行參數。
1、參數argc 和argv 是由main()傳遞的參數個數和內容
2、參數optstring 則代表準備處理的選項字元串

「選項」是什麼?

在linux下大家都用過這樣一條指令吧:gcc -o main main.cpp

這條指令中的 -o 就是命令行的選項,後面的 main-o 選項所攜帶的參數

有些選項是不用帶參數的,而這樣不帶參數的選項可以寫在一起,例如 rm -rf

“選項字元串”是什麼

先看例子吧,"a:b:cd::e",這就是一個選項字元串。對應到命令行就是-a ,-b ,-c ,-d, -e 。

冒號又是什麼呢? 冒號表示參數,一個冒號就表示這個選項後面必須帶有參數,沒有參數就會報錯。

參數的輸入形式 -p80 或者 -p 80,都表示 80 是 -p 的參數。

兩個冒號的就表示這個選項的參數是可選的,即可以有參數,也可以沒有參數。

需要注意的是兩個冒號之間不能有空格。

解析參數

了解完選項和選項參數之後就是通過 getopt 這個函數解析參數了

在此之前了解一下幾個全局參數

extern char *optarg; 用來保存選項的參數

extern int optind 用來記錄下一個檢索位置

opterr 是否將錯誤資訊輸出到stderr,為0時表示不輸出

optopt 保存的是無法識別的選項

大概了解完之後,我們的示常式序如下

#include <stdio.h>
#include <unistd.h>
int main(int argc,char*argv[])
{
    int optch = 0;
	while((optch = getopt(argc, argv, "a:b:cd::e")) != -1)
	{
        // printf("optind: %d\n", optind); //下一個檢索位置,即選項的參數位置
		switch (optch)
		{
        case 'a':
            printf("-a %s\n", optarg);
            break;
        case 'b':
            printf("-b %s\n", optarg);
            break;
        case 'C':
        case 'c':
            printf("-c %s\n", optarg);
            break;
        case 'd':
            printf("d:%s\n", optarg);
            break;
        case 'e':
            printf("-e %s\n", optarg);
            break;
        case '?':
        printf("Unknown option: %c\n",(char)optopt);    //表示不在選項字元串optstring中的選項
            break;
        default:
            break;
		}
	}
    // printf("opterr:%d\n",opterr);  //opterr表示是否將錯誤資訊輸出到stderr,為0時表示不輸出
}

測試程式的選項字元串是a:b:cd::e ,對應的是幾個case標籤,執行程式分別驗證下

a和b有一個 : ,所以a,b選項後面必須攜帶參數

# ./main -a test
-a test
# ./main -b 
./main: option requires an argument -- 'b'
Unknown option: b

不攜帶參數的話就會無法識別參數

c和e沒有 : ,所以 c 選項就類似於 -version 一類的選項

# ./main -c
-c (null)
# ./main -c test
-c (null)

d有兩個: ,所以d選項的參數是可選的,但是要注意參數與選項之間不能有空格

# ./main -dtest
d:test
# ./main -d test
d:(null)

Linux基礎知識科普就介紹到這裡,下一期是關於文件操作的。

Tags: