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 -ltr
是 ls -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
。 (我在这里添加的任何解释都只是同一输出的一个片段。)
我正在尝试创建一个将 $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 -ltr
是 ls -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
。 (我在这里添加的任何解释都只是同一输出的一个片段。)