2012-07-25 53 views
0

我正在處理一個shell腳本,它必須從傳遞的參數中提取字符串。如果我傳遞的參數,如shell腳本從參數中提取字符串

 test.sh arg1=someArgument Arg2=AnoTherArgument 

假設用戶可以傳遞參數,在任何情況下,名稱和值,

我要提取的參數和操作,有些東西一樣

 for arg in "[email protected]" 
     do 
      if [ lower("${arg}") == "arg1" ] then 
       # extract arg1's value and do something 
      elif [ lower("${arg}") == "arg2" ] then 
       # extract arg2's value and do something 
      fi 
     done 

請幫助我如何在傳遞相同的情況下提取參數值?

+1

這是不使用''==內有效POSIX通過環境傳遞的東西'''';改爲使用一個等號「=」。另外,您定位的是哪個外殼和版本? bash 4內置了用於將變量轉換爲大寫和小寫的參數擴展運算符,而無需使用諸如tr之類的外部工具。 – 2012-07-25 12:41:04

+0

你不應該改變你的問題,因爲標題不一致,如果它解決了你的問題,接受答案 – 2012-07-25 12:43:49

回答

0

使用雙括號來匹配glob模式;分號 「然後」

if [[ "$arg" = a=* ]];then echo ${arg#a=};fi 

if [ "${arg%%=*}" = a ];then echo ${arg#a=};fi 

瞭解更多信息

man bash 
/Parameter Expansion 
+0

我已編輯帖子。請看一看。傳遞的參數名稱可以是任何類型。如果是這樣,我可以使用tr [:upper:] [:lower:]將參數轉換爲小寫,但是我怎樣才能提取用戶傳遞的相同大小的參數值。 – Mojoy 2012-07-25 12:27:32

2

爲了清楚起見,我更喜歡這樣的情況下語句之前需要:

while [ $# -gt 0 ] 
do 
    case $1 in 
    a=*) echo ${1#a=};; 
    b=*) echo ${1#b=};; 
    # etc 
    esac 
    shift 
done 
+0

我已編輯帖子。請看一看。傳遞的參數名稱可以是任何類型。如果是這樣,我可以使用tr [:upper:] [:lower:]將參數轉換爲小寫,但是如何以用戶傳遞的相同大小提取參數的值?請幫幫我。 – Mojoy 2012-07-25 12:26:41

+0

'[Aa] [Rr] [Gg] 1)echo $ {1#[Aa] [Rr] [Gg] 1} ;;' – tripleee 2012-07-25 14:13:08

+0

完全相同:只將每個參數的第一部分轉換爲tr [:可能是這樣的(假設每個參數只有一個等號):'case $(echo $ {1%= *} | tr [:upper:] [:lower:])in; arg1)echo $ {1#* =} ;; ; esac'(抱歉顯示不良) – Bentoy13 2012-07-25 15:57:20

0

爲什麼還要努力解析參數?

foo

#!/bin/sh 
echo Value of arg1: ${arg1-default value} 

然後:

$ arg1=blah ./foo 
Value of arg1: blah 

$ ./foo 
Value of arg1: default value 
相關問題