2015-08-05 3 views
0

У меня проблема с getopts. Когда я пишу ./nameofscript.sh -n name - он должен создать новый репозиторий, но он говорит мне: - n - неизвестный параметр и в новой строке: добавление пользователя с именем: пустое.Bash с getopts/flags и несколькими функциями

Почему это происходит?

#!/bin/bash 


    #what2do=${0##*/} 
    #what2do=${what2do%.sh} 


    what2do="addProject" 
    what2do="addRepository" 
    what2do="addUser" 


    doAddRepository() { 
    local repoName="$1" 
    echo "Adding repo with name: $repoName" 
    # Adding new repository with the name $repoName... 
    } 
    doAddProject() { 
    local projName="$1" 
    echo "Adding project with name: $projName" 
    # Adding new project with the name $projName... 
    } 
    doAddUser() { 
    local userName="$1" 
    echo "Adding user with name: $userName" 
    # Some code to add user "$userName"... 
    } 

case $what2do in 
addRepository) 
     while getopts 'n:' key; do 
     case $key in 
      n) REPO_NAME=$OPTARG ;; 
     esac 
     done 
     doAddRepository "$REPO_NAME" 
     exit $? 
    ;; 
addProject) 
     while getopts 'm:' key; do 
     case $key in 
      m) PROJ_NAME=$OPTARG ;; 
     esac 
     done 
     doAddProject "$PROJ_NAME" 
     exit $? 
    ;; 
addUser) 
     while getopts 'u:' key; do 
     case $key in 
      u) USER_NAME=$OPTARG ;; 
     esac 
     done 
     doAddUser "$USER_NAME" 
     exit $? 
    ;; 
    *) 
     echo "I don't know how to $what2do. Maybe, it is NIY" >&2 
    # doShowUsage 
     exit 1 
    ;; 
esac 

ответ

0

Проблема заключается в определении what2do переменной 3 раза в начале кода:

what2do="addProject" 
what2do="addRepository" 
what2do="addUser 

И окончательное значение what2do переменная AddUser. И следующий код выполнен в кейс блок. Который ожидает -u опция.

enteraddUser) 
    while getopts 'u:' key; do 
    case $key in 
     u) USER_NAME=$OPTARG ;; 
    esac 
    done 
    doAddUser "$USER_NAME" 
    exit $? 

Ниже пример кода:

#!/bin/bash 

    what2do="addProject" 
    what2do="addRepository" 
    what2do="addUser" 


    doAddRepository() { 
    local repoName="$1" 
    echo "Adding repo with name: $repoName" 
    # Adding new repository with the name $repoName... 
    } 
    doAddProject() { 
    local projName="$1" 
    echo "Adding project with name: $projName" 
    # Adding new project with the name $projName... 
    } 
    doAddUser() { 
    local userName="$1" 
    echo "Adding user with name: $userName" 
    # Some code to add user "$userName"... 
    } 

getopts 'm:' mode 
modeValue=$OPTARG 

getopts 'p:' paremter 
parameterValue=$OPTARG 

case $modeValue in 
addRepository) 
     doAddRepository "$parameterValue" 
     exit $? 
    ;; 
addProject) 
     doAddProject "$parameterValue" 
     exit $? 
    ;; 
addUser) 
     doAddUser "$parameterValue" 
     exit $? 
    ;; 
    *) 
     echo "I don't know how to $modeValue. Maybe, it is NIY" >&2 
    # doShowUsage 
     exit 1 
    ;; 
esac 

И следующее использование:

./script.sh -m addProject -p ProjectName 
./script.sh -m addUser -p UserName 
./script.sh -m addRepository -p RepositoryName 
+0

Окей так как я могу избавиться от этой проблемы? Должен ли я сделать 3 разных случая и определить в начале 3 другие переменные? Например: what2do, what2do2, what2do3? Это решение? – adamos

+0

На мой взгляд, ваш сценарий может читать два пареметра со входа. Как ./script.sh -m -p parameter. И затем используйте свой скрипт как: Чтобы добавить проект, например: ./script.sh -m project -p project_name –

+0

Можете ли вы показать мне код, как вы его видите? Как насчет переменной «what2do»? – adamos

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