Bash с использованием необязательных параметров - PullRequest
0 голосов
/ 04 июля 2019

Я пытаюсь создать функцию, которая будет принимать $PASS, $USER и $COMMAND в качестве входных данных, $USER и $PASS являются необязательными, то есть будут использоваться имя пользователя и пароли по умолчанию, если не было поставляется в качестве параметров. Вот моя функция

function exec_ssh_command() {
    local PASS=${1:-${ROOT_PW}};    # use argument supplied or default root pw
    local USER=${2:-${ROOT_USER}};
    shift 2
    local COMMAND=$@

    echo "Executing command: ${COMMAND}..."

    sshpass -p ${PASS} ssh ${USER}@${ADDRESS} ${COMMAND}
}

Если это выполняется без аргументов $1 и $2, это нарушает функцию, поэтому на выходе будет что-то вроде sshpass -p ls -ltr ssh {USER}@{ADDRESS} ls -ltr, если мой $COMMAND равен ls -ltr

Как я могу обойти это?

Ответы [ 3 ]

2 голосов
/ 04 июля 2019

Вы можете использовать getopts для анализа позиционных параметров, как показано ниже:

exec_ssh_command() {
    local OPTIND=0
    local OPTARG OPTION
    local pass=${DEFAULT_PASS} user=${DEFAULT_USER}
    while getopts "u:p:" OPTION; do
        case "$OPTION" in
        u) user=$OPTARG;;
        p) pass=$OPTARG;;
        esac
    done

    sshpass -p "$pass" ssh "${user}@${ADDRESS}" "${@:OPTIND}"
}

Sample usages:

exec_ssh_command -u my_user -p my_password ls -ltr
exec_ssh_command -p my_password ls -ltr
exec_ssh_command -p my_password ls -ltr
exec_ssh_command ls -ltr

Пояснение: См. help getopts в приглашении bash для полной информации. (Любое объяснение, которое я бы добавил здесь, было бы просто фрагментом того же вывода.)

0 голосов
/ 04 июля 2019

Если вы хотите заключить соглашение о том, что функция должна вызываться: exec_ssh_command [[user] password] command, вы можете реализовать ее следующим образом:

exec_ssh_command() {
    local pass user
    case $# in
    2) pass=${ROOT_PW}; user="$1"; shift 1;;
    1) pass=${ROOT_PW}; user=${ROOT_USER};;
    *) pass="$1"; user="$2"; shift 2;; 
    esac
    sshpass -p "$pass" ssh "${user}@${ADDRESS?}" "$@"
}

или (в основном одно и то же, просто стилистическая разница):

exec_ssh_command() {
    local pass user
    case $# in
    2) user="$1"; shift 1;;
    1) ;;
    *) pass="$1"; user="$2"; shift 2;;
    esac
    sshpass -p "${pass:-$ROOT_PW}" ssh "${user:-$ROOT_USER}@${ADDRESS?}" "$@"
}
0 голосов
/ 04 июля 2019

Если вы не предоставите хотя бы два аргумента, shift 2 может потерпеть неудачу, потому что для сдвига недостаточно аргументов. Попробуйте проверить их раньше:

if [[ -n "$1" ]] ; then
    PASS="$1"
    shift
else
    PASS="$ROOT_PW"
fi
if [[ -n "$1" ]] ; then
    USER="$1"
    shift
else
    USER="$ROOT_USER"
fi
COMMAND=$@
...
...