成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何在 Bash shell 腳本中解析命令行選項

運維 系統運維
關于命令行界面的 POSIX 規范 中就對選項做出了規范,這也是最早的 UNIX 應用程序建立的一個由來已久的慣例,因此你在創建自己的命令時,最好知道如何將選項包含進 Bash 腳本 中。
  • 給你的 shell 腳本添加選項。

終端命令通常具有 選項或開關,用戶可以使用它們來修改命令的執行方式。關于命令行界面的 POSIX 規范 中就對選項做出了規范,這也是最早的 UNIX 應用程序建立的一個由來已久的慣例,因此你在創建自己的命令時,最好知道如何將選項包含進 Bash 腳本 中。

[[420224]]

與大多數語言一樣,有若干種方法可以解決 Bash 中解析選項的問題。但直到今天,我最喜歡的方法仍然是我從 Patrick Volkerding 的 Slackware 構建腳本中學到的方法,當我第一次發現 Linux 并敢于冒險探索操作系統所附帶的純文本文件時,這些腳本就是我的 shell 腳本的引路人。

Bash 中的選項解析

在 Bash 中解析選項的策略是循環遍歷所有傳遞給 shell 腳本的參數,確定它們是否是一個選項,然后轉向下一個參數。重復這個過程,直到沒有選項為止。

  1. #!/bin/bash 
  2. while [ True ]; do 
  3. if [ "$1" = "--alpha" -o "$1" = "-a" ]; then 
  4.     ALPHA=1 
  5.     shift 1 
  6. else 
  7.     break 
  8. fi 
  9. done 
  10. echo $ALPHA 

在這段代碼中,我創建了一個 while 循環,它會一直進行循環操作,直到處理完所有參數。if 語句會試著將在第一個位置($1)中找到的參數與 --alpha 或 -a 匹配。(此處的待匹配項是任意選項名稱,并沒有特殊意義。在實際的腳本中,你可以使用 --verbose 和 -v 來觸發詳細輸出)。

shift 關鍵字會使所有參數位移一位,這樣位置 2($2)的參數移動到位置 1($1)。處理完所有參數后會觸發 else 語句,進而中斷 while 循環。

在腳本的末尾,$ALPHA 的值會輸出到終端。

測試一下這個腳本:

  1. $ bash ./test.sh --alpha 
  2. $ bash ./test.sh 
  3. $ bash ./test.sh -a 

可以看到,選項被正確地檢測到了。

在 Bash 中檢測參數

但上面的腳本還有一個問題:多余的參數被忽略了。

  1. $ bash ./test.sh --alpha foo 

要想捕獲非選項名的參數,可以將剩余的參數轉儲到 Bash 數組 中。

  1. #!/bin/bash 
  2. while [ True ]; do 
  3. if [ "$1" = "--alpha" -o "$1" = "-a" ]; then 
  4.     ALPHA=1 
  5.     shift 1 
  6. else 
  7.     break 
  8. fi 
  9. done 
  10. echo $ALPHA 
  11. ARG=( "${@}" ) 
  12. for i in ${ARG[@]}; do 
  13.     echo $i 
  14. done 

測試一下新版的腳本:

  1. $ bash ./test.sh --alpha foo 
  2. foo 
  3. $ bash ./test.sh foo 
  4. foo 
  5. $ bash ./test.sh --alpha foo bar 
  6. foo 
  7. bar 

帶參選項

有一些選項需要傳入參數。比如,你可能希望允許用戶設置諸如顏色或圖形分辨率之類的屬性,或者將應用程序指向自定義配置文件。

要在 Bash 中實現這一點,你仍然可以像使用布爾開關一樣使用 shift 關鍵字,但參數需要位移兩位而不是一位。

  1. #!/bin/bash 
  2. while [ True ]; do 
  3. if [ "$1" = "--alpha" -o "$1" = "-a" ]; then 
  4.     ALPHA=1 
  5.     shift 1 
  6. elif [ "$1" = "--config" -o "$1" = "-c" ]; then 
  7.     CONFIG=$2 
  8.     shift 2 
  9. else 
  10.     break 
  11. fi 
  12. done 
  13. echo $ALPHA 
  14. echo $CONFIG 
  15. ARG=( "${@}" ) 
  16. for i in ${ARG[@]}; do 
  17.     echo $i 
  18. done 

在這段代碼中,我添加了一個 elif 子句來將每個參數與 --config 和 -c 進行比較。如果匹配,名為 CONFIG 的變量的值就設置為下一個參數的值(這就表示 --config 選項需要一個參數)。所有參數都位移兩位:其中一位是跳過 --config 或 -c,另一位是跳過其參數。與上節一樣,循環重復直到沒有匹配的參數。

下面是新版腳本的測試:

  1. $ bash ./test.sh --config my.conf foo bar 
  2. my.conf 
  3. foo 
  4. bar 
  5. $ bash ./test.sh -a --config my.conf baz 
  6. my.conf 
  7. baz 

Bash 讓選項解析變得簡單

還有一些其他方法也可以解析 Bash 中的選項。你可以替換使用 case 語句或 getopt 命令。無論使用什么方法,給你的用戶提供選項都是應用程序的重要功能,而 Bash 讓解析選項成為了一件簡單的事。

責任編輯:未麗燕 來源: Linux中國
相關推薦

2023-02-07 09:49:26

Linux命令行合并文件

2021-08-19 14:27:56

Java應用程序解析方法

2022-10-14 19:30:29

Linux

2019-08-15 15:00:31

Linux命令行PDF

2022-11-23 08:14:42

bash 腳本test 命令

2014-06-17 10:02:58

Bash Getopt命令行

2022-11-03 08:13:52

echo 命令Linux

2019-04-12 15:25:15

Fedora 30內核命令行

2016-10-12 08:38:24

Windows 10Defender命令行

2019-08-27 08:00:10

OpenStack命令虛擬機

2018-02-01 17:32:30

LinuxUNIXBash Shell

2023-10-19 14:52:27

2023-08-12 11:40:11

命令行生存

2014-05-04 10:58:18

Linux命令行Linux發行版

2018-04-25 10:46:05

Linux命令行日歷

2009-12-25 17:05:09

LINUX Bash

2015-02-10 10:05:11

LinuxLinux命令

2018-01-24 18:30:53

瀏覽器Firefox命令行

2019-08-20 10:02:35

2010-07-15 10:47:22

Perl命令行
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 黄色一级电影免费观看 | 色免费看 | 国产综合久久 | 国产一级片| 日韩中文字幕在线播放 | 欧美国产一区二区 | 色婷婷亚洲 | 99久久精品免费看国产小宝寻花 | 欧美在线视频二区 | 91在线观看免费 | 欧美mv日韩mv国产网站91进入 | 久久久精品一区二区三区 | caoporn免费| 九色av| 日韩欧美一区二区三区免费观看 | 日日操夜夜操视频 | 亚洲久久一区 | 在线一区 | 午夜激情一区 | 欧美日韩午夜精品 | 色女人天堂 | 香蕉久久久久久 | 国产一区二区免费电影 | 午夜国产羞羞视频免费网站 | 色婷婷一区二区三区四区 | 久久精品免费看 | 人操人免费视频 | 久久视频一区 | 精品美女 | 日韩不卡视频在线 | 成人a网| 九九综合九九 | 亚洲免费一| gogo肉体亚洲高清在线视 | 亚洲精品久久久一区二区三区 | 福利片在线观看 | 国产一区二区三区免费观看视频 | www97影院 | 国产精品久久久久久久久 | 日本精品久久 | 一区二区免费 |