我正在尝试创建一个将$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
我该如何解决?
答案 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?}" "$@"
}