2013-10-26 158 views
4

非常簡單的問題可能是但不能得到這個工作....基本上我有一個XML文件,它在內部允許我傳遞幾個參數到外部程序在我的情況我選擇shell腳本由於不可避免的原因。將參數傳遞給shell腳本

現在它工作的大部分,但我打的問題,本質上我從XML傳遞12個參數到shell腳本 - 在shell中傳遞和消費參數工作正常,直到第9個參數,當我打到第十一個第十二個參數他們是將第10個參數的ARG1與0連接,將第11個參數的ARG1與1連接,並且將第12個參數的Arg1與2連接。

ARG1=$1 # Name  
ARG2=$2 # Text  
ARG3=$3 # Model  
ARG4=$4 # Network Address  
ARG5=$5 # Type  
ARG6=$6 # Landscape  
ARG7=$7 # Cause  
ARG8=$8 # Troubleshooter  
ARG9=$9 # Originiating Event  
ARGX=$10 # Status  
ARGY="$11" # Customer  
ARGZ="$12" # Category 

所以基本上ARG10的值是前ARG1和0可以說你從XML文件傳遞ARG1爲「文本」和ARG10爲「新建」 shell腳本,但是當ARG10在shell腳本是呼應了呼應 - 「text0」而不是新的。
我非常確定這是一件很愚蠢的事情,我需要一些幫助來理解我在編碼時出錯的地方。

回答

9

當您有多個數字時,您需要使用花括號。

ARGX=${10} 

等(請注意,你並不需要圍繞一個參數擴展是一個賦值語句的整個右側引號)。如果沒有括號,$10被解釋爲$1其次是文字0

爲了一致性,您還可以使用大括號作爲單位數參數(以及任何其他shell參數名稱)。但用兩位數的參數號碼,它們是必要的。

一旦你明白了你有那麼多的參數,那麼可能需要尋找某種明確的命名方案。也許你可以使用選項語法,喜歡的東西func -name "$name" -text "$text",等等,那麼你可以做這樣的事情(假設慶典> = 4):

declare -A args=() 
while (($#)); do 
    case "$1" in -*) key="${1#-}";; 
       *) args[$key]="$1";; 
    esac 
    shift 
done 

# now the name is ${args[name]}, text is ${args[text]}, etc. 
+0

當然,謝謝我會試試這個......這是有道理的。我在提出問題之前嘗試過(),但我認爲需要捲曲 – Nik

+1

括號和大括號是不同的。 '$(1)'查找一個名爲「1」的命令,運行它,並用它的輸出替換。 如果解決了您的問題,請接受我的答案。 –

+0

非常感謝,我會嘗試 – Nik

3

一旦記錄參數,你可以shift它關閉名單的論點:

ARG1=$1; shift #Name 
ARG2=$1; shift # Text 
ARG3=$1; shift # Model 
... 
+0

好主意。我沒有想過。我也可以試試這個 – Nik