PHP中如何通過getopt解析GNU C風格命令列選項

2020-07-16 10:05:49
在 PHP 中,當我們在獲取命令列引數時,可以通過遍歷$argv來獲取,其實呢是有規範可循的,也就是 GNU C-style parser for command line options 。

比如使用命令wget下載檔案時,使用下面的一些方式來指定option都可以

wget http://mengkang.net/a.jpg -O b.jpg
wget http://mengkang.net/a.jpg -Ob.jpg --tries=3 -b
wget http://mengkang.net/a.jpg -Ob.jpg --tries=3 -bvd

我們整理下command line options的規則,首先引數分為短引數名和完整引數名,而且一些還有對映關係。比如我們使用wget時,-O對應--output-document。

總結 options 使用規範

● 短選項名,有一個限制,只能是一個char字元,只能1位元組,不能超過1位元組,比如上面的第四個命令的最後一個引數就不知道是一個選項還是三個選項了。

● 短選項名用單個連字元(-)開始

● 短選項可以一個-後面跟多個選項名

● 長選項和短選項可以有對映關係,也可以沒有

● 長選項名,則是多位元組的的,兩個連字元(--)開始

● 選項與實參之間,可以直接連線,也可以用空格隔開,還可以用等號連線

● 但是短選項用等號連線值,等號會被視為值的一部分(但是在 php 裡面卻又相容了這一點)

● 選項分為沒有值,必須傳值,可選傳值(也就是可傳可不傳)

在 PHP 中的使用

getopt ( string $options [, array $longopts [, int &$optind ]] ) : array
https://www.php.net/manual/zh/function.getopt.php

$options 短引數字元列表,引數字元後面用:標識必須傳值;引數字元後面用::標識可選傳值;只有引數字元表示該引數(或者說選項)不接受傳值

$longopts 長引數由於是多位元組,所以必須是陣列,否則沒法分隔。長引數同樣遵循上面::、:規則

php裡面缺少結構體的支撐,相比c的長選項的設定更加簡潔,但也缺少了長短選項的對映關係設定。

$shortOpts = "O:Vv::dh";
$longOpts = ["output-document:","version","verbose::", "debug", "help"]; 
$options = getopt($shortOpts, $longOpts);
var_export($options);
php getopt.php -Oa.jpg 
array (
  'O' => 'a.jpg',
)
php getopt.php -O=a.jpg
array (
  'O' => 'a.jpg',
)
php getopt.php -O a.jpg                                 
array (
  'O' => 'a.jpg',
)
php getopt.php -O=a.jpg -dhV
array (
  'O' => 'a.jpg',
  'd' => false,
  'h' => false,
  'V' => false,
)
php getopt.php -O=a.jpg -dhV -vvv
array (
  'O' => 'a.jpg',
  'd' => false,
  'h' => false,
  'V' => false,
  'v' => 'vv',
)

上面例子中我的短引數和長引數是對應的,但是沒有資料結構來表示他們的對應關係(在C裡面有option結構體來做這個對應關係的管理),所以我們兩個都傳的話,程式兩個值會收到,然後我們自己判斷短引數和長引數使用哪個。

php getopt.php -O=a.jpg -dhV -vvv --output-document b.jpg --debug
array (
  'O' => 'a.jpg',
  'd' => false,
  'h' => false,
  'V' => false,
  'v' => 'vv',
  'output-document' => 'b.jpg',
  'debug' => false,
)

這樣寫是不規範的,盡量避免這樣的寫法。

php getopt.php -O=a.jpg -dhVvvv  
array (
  'O' => 'a.jpg',
  'd' => false,
  'h' => false,
  'V' => false,
  'v' => 'vv',
)
php getopt.php -O=a.jpg -dhvvvV
array (
  'O' => 'a.jpg',
  'd' => false,
  'h' => false,
  'v' => 'vvV',
)

總結了這個GNU C command line options 使用的套路,命令使用起來就更溜了,不會懵逼為什麼linux下各種工具使用的案例寫法「千奇百怪」了。

在C裡面並不支援短選項和值用等號連線,在PHP裡卻是可以的,需要注意。

111

推薦:《PHP教學

以上就是PHP中如何通過getopt解析GNU C風格命令列選項的詳細內容,更多請關注TW511.COM其它相關文章!