2015-11-16 3 views
1

Я новичок в bash, и я начал работать над простым скриптом bash, чтобы включать или отключать контакты GPIO на малине. Я хотел бы предоставить аргументы скрипту следующим образом: script.sh GPIO_number start/on/off/clean. Как я могу продолжить этот сценарий наиболее эффективным способом? Я застрял во втором аргументе.Несколько аргументов в скрипт bash

#!/bin/bash 

if [ -z $1 ]; then 
     echo "Usage: gpioaction.sh GPIO start/on/off/clean" 
     exit 1 
fi 

if [ -z $2 ]; then 
     echo "Usage: gpioaction.sh GPIO start/on/off/clean" 
     exit 1 
fi 

PIN=$1 

start=$(echo "$PIN" > /sys/class/gpio/export;echo "out" > /sys/class/gpio/gpio$PIN/direction;echo "1" > /sys/class/gpio/gpio$PIN/value) 
on=$(echo "1" > /sys/class/gpio/gpio$PIN/value) 
off=&(echo "0" > /sys/class/gpio/gpio$PIN/value) 
clean=&(echo "$PIN" > /sys/class/gpio/unexport) 
+1

Определение "Я застрял на второй аргумент." Вы знаете, как использовать позиционные параметры '$ 1' и' $ 2'. Тогда в чем проблема? – 4ae1e1

+0

@ 4ae1e1 Ну, $ 2 можно определить для начала, включения, выключения или очистки. Можете ли вы написать мне пример для: script.sh 19 start и script.sh 19 clean – burek

+0

Все еще не уверен, что вы имеете в виду, но похоже, что вам нужен 'case': https://www.gnu.org/software/bash/ ручной/bash.html # Условные-конструкты. – 4ae1e1

ответ

0

Вы, кажется, «закрыть» - то, что у вас есть присваивает значения переменным (а = выход из некоторой команды) и быстро проходят через все команды; возможно, что-то, как это ближе к тому, что вы ищете:

function gpio_start { 
echo "$PIN" > /sys/class/gpio/export 
echo "out" > /sys/class/gpio/gpio$PIN/direction 
echo "1" > /sys/class/gpio/gpio$PIN/value 
} 
### 
case "$2" ### here you could use functions or simple commands lines 
in 
     start) replace_with_fucntion_or_start_steps ;; 
      on) replace_with_fucntion_or_on_steps ;; 
      off) replace_with_fucntion_or_off_steps ;; 
     clean) replace_with_fucntion_or_clean_steps ;; 
      *) echo "Usage: gpioaction.sh GPIO start/on/off/clean" ; exit ;; 
esac 
### 
Another, closer to what you have example: 

case "$2" 
in 
     start) gpio_start ;; ## use function for multiple commands 
      on) echo "1" > /sys/class/gpio/gpio$PIN/value ;; 
      off) echo "0" > /sys/class/gpio/gpio$PIN/value ;; 
     clean) echo "$PIN" > /sys/class/gpio/unexport ;; 
      *) echo "Usage: gpioaction.sh GPIO start/on/off/clean" ; exit ;; 
esac 

Если вы используете случай заявление, то вам не очень нужна ваша «вторая проверка» с помощью «если» заявление.

:)
Dale

+0

Ключевое слово 'function' делает ваш код несовместимым с PO SIX sh без добавления преимуществ по сравнению с синтаксисом. Лучше определить функции как 'gpio_start() {...}', чем 'function gpio_start {...}'. –

+0

Ваш комментарий помогает оригинальному плакату? Я думаю, что человек, задающий вопрос, будет лучше обслуживаться с «лучшим ответом», а не вторичным комментарием, который может или не может иметь отношение к среде, в которой будет использоваться код. Хотя ваш комментарий может иметь достоинства, я не вижу его полезным для вопроса NOOB (то есть «Я новичок в bash ...»! = Я хотел бы иметь глубокий дискурс во всех причудах с помощью сценариев оболочки ... –

+0

Если этот совет помогает избежать изучения набора привычек, которые приведут к неожиданному поведению (другие оболочки, дающие ошибки анализа с их сценариями вниз по линии), то, безусловно, это полезно. Тем не менее, предполагаемая аудитория этот комментарий был * вы *, в надежде на то, что вы отредактируете свой ответ, чтобы продемонстрировать более эффективные методы для тех, например, оригинального плаката, которые (действительно) достаточно рано в процессе обучения, чтобы не быть настолько подходящими, чтобы эти различия сами по себе. –