2016-01-29 6 views
1

У меня есть сценарий для запуска некоторых проверок на машине Ubuntu.Bash getopt - shift multiple parameters

Я называю мой сценарий, как это: ./script -f /tmp/file.txt --modules 001 002 003

Все файлы 001, 002, и т.д. ... это Баш скрипты.

Следующая основная функция заключается моя проблема:

main() { 
OPTS=`getopt -o hf:m: --long help,file:,modules: -n 'script.sh' -- "[email protected]"` 

eval set -- "$OPTS" 
    [ $# -eq 0 ] && echo "Unknown options or parameters" && USAGE 

while [ $# -gt 0 ]; do 
    case "$1" in 
      -f|--file) 
       FILE="$2" 
       shift 
       ;; 
      -h|--help) 
       USAGE 
       exit 1 
       ;; 
      -m|--modules) 
       MODULES="$2" 
       shift 
       ;; 
    esac 
    shift 
done 

[ -z "$MODULES" ] && echo "No module specified" && USAGE 
} 

Я бы, что переменные $ МОДУЛЕЙ содержит, например 001 002 004.
Я пробовал разные вещи со сменой, но это сложно ..

В идеале, если я могу использовать «$ @» в качестве остальных параметров скрипта, это может быть здорово.

EDIT: с ./script.sh -f /tmp/file.txt --modules "001 002 003", наконец, переменная $ MODULES содержит, например, «001 002 003».

Но у меня есть цикл for, который, кажется, не перебирает все аргументы, только на первом ... каждый $module содержит «001 002 003».

for module in "$MODULES"; do 
    echo "Importing Module $module" 
    . modules/$module >> "$FILE" 
done 
+0

вы должны выяснить what't разница между ссылкой на переменную и оставить его без кавычек с 'для мод в«$ МОДУЛИ»', вы только когда-либо будет иметь одну итерацию цикла.. С 'для мод в «$ MODULES» ', вы разрешаете оболочке выполнять [разделение слов] (https://www.gnu.org/software/bash/manual/bashref.html#Word-Splitting) (и [расширение имени файла] (https : //www.gnu.org/software/bash/manual/bashref.html#Filename-Expansion)!) по значению переменной, поэтому вы будете иметь несколько итераций через цикл. [Будьте осторожны, хотя] (http://unix.stackexchange.com/q/171346/4667) –

+0

Мне кажется, мне нужно использовать список (а не переменную), но я не вижу, как создать список в моем Случай' цикл. – Isador

+0

Вы бы сделали: 'set -f; модули = ($ 2); set + f' - - команды команд отключить/включить расширение имени файла –

ответ

0

Getopt не может получить произвольное число значений, но вы можете передать список модулей в качестве параметра usign ", а позже он парсер:

./script -f /tmp/file.txt --modules "001 002 003" 

Внутри вашего сценария вы можете получить каждое отдельное значение :

for module in $MODULES ; do 
    echo $module 
done 
+0

Это не работает. Когда я передаю ваши команды, переменная '$ MODULES' содержит только первый аргумент. Это связано с' MODULES = $ 2'. Думаю. – Isador

+0

You должен установить MODULES = «$ 2» (используя «, чтобы включить все значения») –

+1

Я проверил ваш код, я думаю, что проблема в том, что вы должны ссылаться на главную, используя «.' main «$ @" ' –