Используйте OPTARG в качестве переменной в скрипте оболочки, независимо от порядка аргументов - PullRequest
0 голосов
/ 03 июля 2019

предположим, у меня есть такой скрипт: (назовем его test.sh)

#!/bin/sh

function php() {
    printf "The rhost is ${RHOST} and the lport is ${LPORT}"
}

while getopts "hr:l:s:" arg; do
    case $arg in
        h)
            printf "Usage\n"
        ;;

        r)
            RHOST=$OPTARG
        ;;

        l)
            LPORT=$OPTARG
        ;;

        s)
            SHELL=$OPTARG

            if [[ "$SHELL" == "php" ]] || [[ "$SHELL" == "PHP" ]] ; then
                php

            fi
       ;;
    esac
done

Если я запускаю свой скрипт как "test.sh -r 10 -l 4 -s php"

Мой скрипт будет работать так, как я хочу ...

Однако, если я запустлю его как «test.sh -s php -r 10 -l 4»

Переменные rhost и lport никогда не попадают в функцию php. Я понимаю, что это потому, что его называют первым. Однако мой вопрос заключается в том, как мне написать сценарий, чтобы независимо от порядка выполнения аргументов я все еще мог использовать rhost и lport в качестве переменных?

Я также пытался поиграть со смещением, но думаю, что это не ответ, или я помещаю команду смещения в неправильное место.

1 Ответ

4 голосов
/ 03 июля 2019

Переместите логику «если» из переключателя / корпуса:

#!/bin/sh
function php() {
    printf "The rhost is ${RHOST} and the lport is ${LPORT}"
}

while getopts "hr:l:s:" arg; do
    case $arg in
        h)
            printf "Usage\n"
        ;;

        r)
            RHOST=$OPTARG
        ;;

        l)
            LPORT=$OPTARG
        ;;

        s)
            SHELL=$OPTARG         
       ;;
    esac    
done

if [[ "$SHELL" == "php" ]] || [[ "$SHELL" == "PHP" ]] 
then
   php
fi
...