Bash 使用可选参数

Bash using optional parameters

我正在尝试创建一个将 $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}
}

如果这是没有 </code> 和 <code> 参数的 运行 它会破坏函数,所以如果我的 $COMMAND 输出将类似于 sshpass -p ls -ltr ssh {USER}@{ADDRESS} ls -ltrls -ltr

我该如何解决这个问题?

如果您没有提供至少两个参数,shift 2 可能会失败,因为没有足够的参数可供转移。之前尝试测试它们:

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

如果你想约定调用函数:exec_ssh_command [[user] password] command,你可以这样实现:

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

或(基本相同,只是文体不同):

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

您可以使用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。 (我在这里添加的任何解释都只是同一输出的一个片段。)