2013-10-26 4 views
4

Очень простой вопрос может быть, но не в состоянии получить эту работу .... по существу у меня есть XML-файл, который внутренне позволяет мне передавать несколько аргументов внешней программе в моем случае я выбрал сценарий оболочки из-за неизбежных причин.Передача аргументов в скрипт оболочки

Теперь он работает по большей части, но я попал в проблему, по сути, я прохожу 12 аргументов из XML в shell-скрипт. Передача и использование аргументов в оболочке отлично работали до 9-го аргумента, когда я ударил 10-й 11-й 12-й аргумент, который они конкатенация ARG1 с 0 для 10-го аргумента, ARG1 с 1 для 11-го аргумента и Arg1 с 2 для 12-го аргумента.

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 для экс позволяет сказать, что вы передаете ARG1 как «текст» и ARG10 как «Новый» из файла XML в сценарий оболочки, но когда ARG10 вторит в сценарии оболочки это эхо - «text0» вместо нового.
Я очень уверен, что это глупая вещь, мне нужно понять, где я ошибаюсь в ее кодировании.

ответ

9

Вам нужно использовать фигурные скобки, если у вас более одной цифры.

ARGX=${10} 

и т.д. (Обратите внимание, что вам не нужно кавычки вокруг расширения параметра, который вся правая сторона оператора присваивания). Без скобок $10 интерпретируется как $1 с последующим буквального 0.

Вы также можете использовать фигурные скобки для одноразрядных аргументов (а также любых других имен параметров оболочки) только для согласованности. Но с двузначными номерами аргументов они необходимы.

Как только вы дойдете до такой степени, что у вас есть что-то много параметров, однако, возможно, стоит посмотреть на какую-то явную схему именования. Может быть, вы могли бы использовать синтаксис опции, с чем-то вроде 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

Смежные вопросы