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基礎知識科普就介紹到這裡,下一期是關於文件操作的。