捕获用户输入bash if/then/elif

捕获用户输入bash if/then/elif,bash,if-statement,ssh,Bash,If Statement,Ssh,我正在尝试创建一个简单的脚本,用于通过ssh登录到各种服务器,所有密钥都已安装并正在工作,但我无法让这个脚本为我工作。基本上,用户可以选择登录哪个服务器,但会不断出现以下错误: ': not a valid identifier `INPUT login.sh: line 24: syntax error near unexpected token `elif' 'ogin.sh: line 24: `elif [ $INPUT -eq 2 ] ; then 可以在下面找到脚本布局,其中包含虚

我正在尝试创建一个简单的脚本,用于通过ssh登录到各种服务器,所有密钥都已安装并正在工作,但我无法让这个脚本为我工作。基本上,用户可以选择登录哪个服务器,但会不断出现以下错误:

': not a valid identifier `INPUT
login.sh: line 24: syntax error near unexpected token `elif'
'ogin.sh: line 24: `elif [ $INPUT -eq 2 ] ; then
可以在下面找到脚本布局,其中包含虚拟信息:

#!/bin/bash
echo "What Server would you like to login to?"
echo ""
echo ""
echo "1. Server 1"
echo "2. Server 2"
echo "3. Server 3"
echo "4. Server 4"
echo "5. Exit"
read INPUT
if [ $INPUT -eq 1 ] ; then
echo"Logging in"
echo"..."
ssh root@1.2.3.4 -p 5678

elif [ $INPUT -eq 2 ] ; then
echo"Logging in"
echo"..."
ssh root@1.2.3.4 -p 5678

elif [ $INPUT -eq 3 ] ; then
echo"Logging in"
echo"..."
ssh root@1.2.3.4 -p 5678

elif [ $INPUT -eq 4 ] ; then
echo"Logging in"
echo"..."
ssh root@1.2.3.4 -p 5678

elif [ $INPUT -eq 5 ] ; then
exit 0
else
echo "invalid choice"
return
fi

任何帮助都将不胜感激,这对使用bash来说是比较新的,现在这让我很恼火

看起来您是在windows上创建此文件的。 尝试使用dos2unix,如:

dos2unix <your_script>
dos2unix

看起来您是在windows上创建此文件的。 尝试使用dos2unix,如:

dos2unix <your_script>
dos2unix

尝试复制粘贴脚本,效果良好。我对它做了更多的修改,以使无效选项起作用

嗯。。。对不起,但对我有用吗

#!/bin/bash
while true ; do
    echo "What Server would you like to login to?"
    echo ""
    echo ""
    echo "1. Server 1"
    echo "2. Server 2"
    echo "3. Server 3"
    echo "4. Server 4"
    echo "5. Exit"

    read INPUT
    if [ $INPUT -eq 1 ] ; then
        echo "Logging in 1"
        echo "..."
        ssh root@1.2.3.4 -p 5678

    elif [ $INPUT -eq 2 ] ; then
        echo "Logging in 2"
        echo "..."
        ssh root@1.2.3.4 -p 5678

    elif [ $INPUT -eq 3 ] ; then
        echo "Logging in 3"
        echo "..."
        ssh root@1.2.3.4 -p 5678

    elif [ $INPUT -eq 4 ] ; then
        echo "Logging in 4"
        echo "..."
        ssh root@1.2.3.4 -p 5678

    elif [ $INPUT -eq 5 ] ; then
        exit 0
    else
        echo "invalid choice"
    fi
done

通过复制粘贴尝试了你的脚本,它成功了。我对它做了更多的修改,以使无效选项起作用

嗯。。。对不起,但对我有用吗

#!/bin/bash
while true ; do
    echo "What Server would you like to login to?"
    echo ""
    echo ""
    echo "1. Server 1"
    echo "2. Server 2"
    echo "3. Server 3"
    echo "4. Server 4"
    echo "5. Exit"

    read INPUT
    if [ $INPUT -eq 1 ] ; then
        echo "Logging in 1"
        echo "..."
        ssh root@1.2.3.4 -p 5678

    elif [ $INPUT -eq 2 ] ; then
        echo "Logging in 2"
        echo "..."
        ssh root@1.2.3.4 -p 5678

    elif [ $INPUT -eq 3 ] ; then
        echo "Logging in 3"
        echo "..."
        ssh root@1.2.3.4 -p 5678

    elif [ $INPUT -eq 4 ] ; then
        echo "Logging in 4"
        echo "..."
        ssh root@1.2.3.4 -p 5678

    elif [ $INPUT -eq 5 ] ; then
        exit 0
    else
        echo "invalid choice"
    fi
done

我会站在公共汽车前面回答你没有问的问题。为什么不使用
选择

echo 'Which server would you like to log into?'
select server in 192.168.0.1 192.168.0.2 192.168.0.3 192.168.0.4; do
    printf 'Logging in to server %s...\n' "$server"
    ssh "$server" -p "$port"
done
如果您不喜欢选择
,那么为什么不至少使用
案例

read -p 'Which server do you want? ' input
case "$input" in
    whatever)
        printf 'Logging in to server %s...\n' "$server"
        ssh "$server" -p "$port"
        ;;
    *)
        echo 'Invalid option'
        ;;
esac

我会站在公共汽车前面回答你没有问的问题。为什么不使用
选择

echo 'Which server would you like to log into?'
select server in 192.168.0.1 192.168.0.2 192.168.0.3 192.168.0.4; do
    printf 'Logging in to server %s...\n' "$server"
    ssh "$server" -p "$port"
done
如果您不喜欢选择
,那么为什么不至少使用
案例

read -p 'Which server do you want? ' input
case "$input" in
    whatever)
        printf 'Logging in to server %s...\n' "$server"
        ssh "$server" -p "$port"
        ;;
    *)
        echo 'Invalid option'
        ;;
esac

我知道这不能回答你的问题,但你说你是bash的新手。我建议使用case语句而不是一堆ifs,我还为read语句添加了一个提示(使用-p选项)。您还可以查看select语句,而不是案例

#!/bin/bash
echo "What Server would you like to login to?"
echo ""
echo ""
echo "1. Server 1"
echo "2. Server 2"
echo "3. Server 3"
echo "4. Server 4"
echo "5. Exit"
read -p "cmd> " INPUT

case $INPUT in

1)
    echo "Logging in"
    echo "..."
    echo ssh root@1.2.3.4 -p 5678
    ;;

2)
    echo "Logging in"
    echo "..."
    echo ssh root@1.2.3.4 -p 5678
    ;;

3)
    echo "Logging in"
    echo "..."
    echo ssh root@1.2.3.4 -p 5678
    ;;

4)
    echo "Logging in"
    echo "..."
    echo ssh root@1.2.3.4 -p 5678
    ;;

5)
    echo "exiting"
    exit 0
    ;;

*)
    echo "invalid choice"
    return
    ;;
esac

我知道这不能回答你的问题,但你说你是bash的新手。我建议使用case语句而不是一堆ifs,我还为read语句添加了一个提示(使用-p选项)。您还可以查看select语句,而不是案例

#!/bin/bash
echo "What Server would you like to login to?"
echo ""
echo ""
echo "1. Server 1"
echo "2. Server 2"
echo "3. Server 3"
echo "4. Server 4"
echo "5. Exit"
read -p "cmd> " INPUT

case $INPUT in

1)
    echo "Logging in"
    echo "..."
    echo ssh root@1.2.3.4 -p 5678
    ;;

2)
    echo "Logging in"
    echo "..."
    echo ssh root@1.2.3.4 -p 5678
    ;;

3)
    echo "Logging in"
    echo "..."
    echo ssh root@1.2.3.4 -p 5678
    ;;

4)
    echo "Logging in"
    echo "..."
    echo ssh root@1.2.3.4 -p 5678
    ;;

5)
    echo "exiting"
    exit 0
    ;;

*)
    echo "invalid choice"
    return
    ;;
esac

这个答案实际上只是一个注释,但注释不适合于代码。您的脚本可以大大简化。考虑一下:

#!/bin/bash

servers=( host1 host2 host3 )
ips=( 192.168.1.1 192.168.1.2 192.168.1.3 )
ports=( 123 22 33 )
select server in ${servers[@]}; do
    echo "Logging into $server..."
    ssh root@${ips[$REPLY]} -p ${ports[$REPLY]}
break
done

(虽然还不清楚为什么要指定IP地址而不是使用主机名!)

这个答案实际上只是一个注释,但注释不适用于代码。您的脚本可以大大简化。考虑一下:

#!/bin/bash

servers=( host1 host2 host3 )
ips=( 192.168.1.1 192.168.1.2 192.168.1.3 )
ports=( 123 22 33 )
select server in ${servers[@]}; do
    echo "Logging into $server..."
    ssh root@${ips[$REPLY]} -p ${ports[$REPLY]}
break
done

(虽然还不清楚为什么要指定IP地址而不是使用主机名!)

在传输之前使用了桌面+升华文本,但从未想过,谢谢!在传送之前使用桌面+升华文本,从未想过,谢谢!除了将用户输入直接输入到算术评估中之外,这是一个非常好的选择。关联数组可以解决这个问题,或者输入验证。这比直接将用户输入输入到算术计算中要好得多。关联数组可以解决这个问题,也可以进行输入验证。