2016-01-15 2 views
1

У меня есть Баш скрипт, который начинается так:Баш скрипт выбора переменной на основе параметра командной строки

#!/bin/bash 
systemStateGlobalSystemState=.1.3.6.1.4.1.674.10909.1.200.10.1.2 
systemStateChassisStatus=.1.3.6.1.4.1.674.10909.1.200.10.1.4 
systemStateVoltageStatusCombined=.1.3.6.1.4.1.674.10909.1.200.10.1.12 
systemStateTemperatureStatusCombined=.1.3.6.1.4.1.674.10909.1.200.10.1.24 
systemStateMemoryDeviceStatusCombined=.1.3.6.1.4.1.674.10909.1.200.10.1.27 
     systemStateChassisIntrusionStatusCombined=.1.3.6.1.4.1.674.10909.1.200.10.1.30 
operatingSystemMemoryStatus=.1.3.6.1.4.1.674.10909.1.400.20.1.4 

RESULT=$(/usr/local/nagios/libexec/check_snmp -H $1 -o $2 -c $3) 
CODE=$(echo $RESULT | awk '{print $4}') 

То, что я пытаюсь сделать, это если кто-то за $ 2 параметр командной строки входит operatingSystemMemoryStatus как я выбрать предопределенное значение для него в скрипте? Итак, где $ 2 выше указано в RESULT, как мне получить эту команду для использования значения .1.3.6.1.4.1.674.10909.1.400.20.1.4?

Так что, если я вошел

check_snmp 192.168.0.1 operatingSystemMemoryStatus public script 

бы:

/usr/local/nagios/libexec/check_snmp -H 192.168.0.1 -o .1.3.6.1.4.1.674.10909.1.400.20.1.4 -c public 

Как я могу это сделать?

+0

Возможный дубликат (http://stackoverflow.com/questions/ 192249/how-do-i-parse-command-line-arguments-in-bash) –

+0

Не дубликат. Это сообщение не показывает, как принимать параметры командной строки и назначать значение на основе существующей определенной переменной с тем же именем. – John

+0

Вы можете использовать ассоциативный массив, как в [этом вопросе] (http://stackoverflow.com/questions/16553089/bash-dynamic-variable-names). – Corubba

ответ

1

Я думаю, вы хотите использовать косвенную расширение, как это:

#!/bin/bash 
systemStateGlobalSystemState=.1.3.6.1.4.1.674.10909.1.200.10.1.2 
systemStateChassisStatus=.1.3.6.1.4.1.674.10909.1.200.10.1.4 
systemStateVoltageStatusCombined=.1.3.6.1.4.1.674.10909.1.200.10.1.12 
systemStateTemperatureStatusCombined=.1.3.6.1.4.1.674.10909.1.200.10.1.24 
systemStateMemoryDeviceStatusCombined=.1.3.6.1.4.1.674.10909.1.200.10.1.27 
systemStateChassisIntrusionStatusCombined=.1.3.6.1.4.1.674.10909.1.200.10.1.30 
operatingSystemMemoryStatus=.1.3.6.1.4.1.674.10909.1.400.20.1.4 

echo "you are looking for ${!2} value" 
RESULT=$(/usr/local/nagios/libexec/check_snmp -H $1 -o ${!2} -c $3) 
CODE=$(echo $RESULT | awk '{print $4}') 

и назвать его как то

./myscript 192.168.0.1 operatingSystemMemoryStatus public script 

you are looking for .1.3.6.1.4.1.674.10909.1.400.20.1.4 value 
<expected result, which I cannot simulate on my box> 

в man bash вы можете прочитать

If the first character of parameter is an exclamation point (!), it introduces a level of variable indirection. Bash uses the value of the variable formed 
    from the rest of parameter as the name of the variable; this variable is then expanded and that value is used in the rest of the substitution, rather than 
    the value of parameter itself. This is known as indirect expansion. 
+0

Отлично. Так оно и было. Благодарю. Хотел бы я отметить это как ответ на мой вопрос. Только позволяет отмечать ответ, что другой поток - это мой ответ. – John

+0

Вы должны увидеть в левом верхнем углу (до того, как я думаю .... »стрелка вверх, ноль, стрелка вниз и большой V - если вы нажмете V, это сделает ответ. Может быть, мне нужно сначала проголосовать за него стрелка вверх (полезная), я не уверен в этом – gilhad

+1

@ Джон - Я думаю, вам нужно немного подождать, прежде чем вы сможете принять его в качестве правильного ответа. Попробуйте повторить проверку через день или два. – alvits

1

Вы можете использовать ассоциативный массив для достижения этого:

declare -A lookup=(['foo']='bar' ['x']='y') 
echo "${lookup[foo]}" # Prints "bar" 
1

Используйте конструкцию выключателя. Я добавил трехбуквенную альтернативу для всех вариантов:

case $2 in 
    "gss"|"systemStateGlobalSystemState") 
     check=".1.3.6.1.4.1.674.10909.1.200.10.1.2" 
     ;; 
    "scs"|"systemStateChassisStatus") 
     check=".1.3.6.1.4.1.674.10909.1.200.10.1.4" 
    ;; 
    "vsc"|"systemStateVoltageStatusCombined") 
     check=".1.3.6.1.4.1.674.10909.1.200.10.1.12" 
    ;; 
    "tsc"|"systemStateTemperatureStatusCombined") 
     check=".1.3.6.1.4.1.674.10909.1.200.10.1.24" 
    ;; 
    "dsc"|"systemStateMemoryDeviceStatusCombined") 
     check=".1.3.6.1.4.1.674.10909.1.200.10.1.27" 
    ;; 
    "isc"|"systemStateChassisIntrusionStatusCombined") 
     check=".1.3.6.1.4.1.674.10909.1.200.10.1.30" 
    ;; 
    "sms"|"operatingSystemMemoryStatus") 
     check=".1.3.6.1.4.1.674.10909.1.400.20.1.4" 
    ;; 
    *) echo "Invalid option $1" 
    ;; 
esac 
echo "Use $check now" 

Я только что скопировал/вставил значения. Не лучшим образом, вы можете ввести переменные, которые будут делать сравнения и обновление значений проще: [? Как разобрать аргументы командной строки в Баше]

precheck=".1.3.6.1.4.1.674.10909.1" 
systemcheck="200.10.1" 
oscheck="400.20.1" 
    case $2 in 
     "gss"|"systemStateGlobalSystemState") 
      check="${precheck}.${systemcheck}.2" 
      ;; 
     "scs"|"systemStateChassisStatus") 
      check="${precheck}.${systemcheck}.4" 
     ;; 
     "vsc"|"systemStateVoltageStatusCombined") 
      check="${precheck}.${systemcheck}.12" 
     ;; 
     "tsc"|"systemStateTemperatureStatusCombined") 
      check="${precheck}.${systemcheck}.24" 
     ;; 
     "dsc"|"systemStateMemoryDeviceStatusCombined") 
      check="${precheck}.${systemcheck}.27" 
     ;; 
     "isc"|"systemStateChassisIntrusionStatusCombined") 
      check="${precheck}.${systemcheck}.30" 
     ;; 
     "sms"|"operatingSystemMemoryStatus") 
      check="${precheck}.${oscheck}.4" 
     ;; 
     *) echo "Invalid option $1" 
     ;; 
    esac 
    echo "Use $check now" 
+0

Спасибо Уолтеру. Я закончил с этим уже и работаю, однако ваш предложение определенно гарантирует возвращение и попытку. Оставайтесь с нами. – John

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