2014-02-17 63 views
0

我有bash腳本,我希望能夠跳過(即 - 不執行)其基於調用腳本時傳遞的選項的一些命令。如何使用bash中的選項跳過部分代碼

爲了說明我想完成的任務,我寫了一個基本完成同樣事情的語句if

if [ "$1" != "skipA" ] 
    then 
    echo "A" 
fi 

if [ "$1" != "skipB" ] 
    then 
    echo "B" 
fi 

if [ "$1" != "skipC" ] 
    then 
    echo "C" 
fi 

if [ "$1" != "skipD" ] 
    then 
    echo "D" 
fi 

當在調用腳本沒有傳遞參數,所有四個echo語句執行。如果我想跳過這些回聲語句之一,我用skipLETTER作爲第一個參數:

./script.sh skipA 

和除A所有字母被打印出來。它可以工作,但它確實有很多限制 - 例如,我不能使用相同的參數跳過很多部分($1)。我想實現的選項同樣的事情,所以我可以輸入類似:

./script -skipA -skipD 

,結果只打印BC字母。

我知道我可以用getoptgetopts來達到這個目的,但我找不到任何簡單的用法例子來達到我所描述的。

+0

可能你可以在你的if語句中放置'continue'以跳過第一個參數..好? – MLSC

回答

0

我使用的碼與下面的算法:

  1. 捕捉所有的可執行代碼中的函數在文件1
  2. 呼叫序列按照所述邏輯中的每個函數file2中
  3. 儘管主叫file2的,每個呼叫將被限制爲一個內線並將其命名爲步驟
  4. 呼叫file2並帶有跳過的選項
  5. 有一個if語句來讀取作爲步驟的行並檢查當前步驟少於所需步驟,如果是則繼續下一步驟。否則使用eval來處理它。
+0

感謝您的提示,但是您所描述的實際上比使用簡單的if語句(至少據我瞭解)要複雜得多 - 因爲步驟4是我所做的(儘管在那裏只有一個文件)並且具有相同的限制(只有一個參數)。我要求解決方案的選項,因爲它比現在更容易使用。 – Rafal

+0

在這種方法中,您可以從失敗的位置重新啓動。 :) file1的行爲更像一個庫(它不是複雜的,當你建立和實際上它的模塊化) – SriniV

0

POSIX標準的getopts不能做長選項,只能使用單字符的,所以你不能在問題中概述的確切接口中使用它。如果-skipA是單個選項(帶有可能的optarg),或者在沒有知道實用程序的詳細信息的情況下無法分辨,或者捆綁了五個單字符選項(-x -y-xy相同,兩者都不同於--xy)。

便攜式代碼(getopts spec)前進,並選擇s跳過選項,這裏有一個簡單的例子:

#!/bin/sh 

contains() 
{ 
    case "$1" in 
    *$2*) return 0 ;; 
    esac 
    return 1 
} 

requested() 
{ 
    ! contains "$skip" "$1" 
} 

while getopts s: optname; do 
    case $optname in 
    s) skip="$OPTARG" ;; 
    ?) exit 1 ;; 
    esac 
done 

if requested A; then 
    echo A 
fi 
if requested B; then 
    echo B 
fi 
if requested C; then 
    echo C 
fi 
if requested D; then 
    echo D 
fi 

您可以./skip-parts.sh -s AC和類似的測試。它會反應到未知的選擇和-s沒有OPTARG類似消息

./skip-parts.sh: illegal option -- x 
./skip-parts.sh: option requires an argument -- s 

,如果你不喜歡默認的錯誤信息,您可以通過預先計算的第一個參數getopts的讓他們保持沉默(1)一個冒號,並給你自己的?的情況下(選項需要一個參數案件通過設置optname給冒號發信號,但你說你已經閱讀過文檔)。