使用可选参数重击

时间:2019-07-04 03:54:17

标签: bash parameters shift

我正在尝试创建一个将$PASS$USER$COMMAND作为输入的函数,$USER$PASS是可选的,这意味着如果将non作为参数提供,它将使用默认的用户名和密码。这是我的功能

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 个答案:

答案 0 :(得分:2)

您可以使用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

说明: 有关完整信息,请参见bash提示上的help getopts。 (我将在此处添加的任何解释都只是来自同一输出的摘要。)

答案 1 :(得分:0)

如果不提供至少两个参数,则 public class BubbleSort { void bubbleSort(double arr[]) { int n = arr.length; for (int i = 0; i < n-1; i++) for (int j = 0; j < n-i-1; j++) if (arr[j] > arr[j+1]) { System.out.print("first value :"+arr[j]+" greater than" +"previos :"+arr[j+1] + " "); System.out.println(); // swap arr[j+1] and arr[i] double temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } /* Prints the array */ void printArray(double arr[]) { int n = arr.length; for (int i=0; i<n; ++i) System.out.print(arr[i] + " "); System.out.println(); } // Driver method to test above public static void main(String args[]) { BubbleSort ob = new BubbleSort(); double arr[] = {1.66, 1.55, 1.44}; ob.bubbleSort(arr); System.out.println("Sorted array"); ob.printArray(arr); } } 可能会失败,因为没有足够的参数可移动。尝试对它们进行以下测试:

shift 2

答案 2 :(得分:0)

如果要约定调用函数的名称: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?}" "$@"
}