传递用户输入字符串以使用 if-else 条件进行检查

传递用户输入字符串以使用 if-else 条件进行检查
str1="ace"
str2="com"
str3="ros"
$name = readinput(Enter name:)

if [[ "$name" == "$str1" ]]; 
then

run ace.txt
else
if [[ "$name" == "$str2" ]];
then

run commscope.txt
else
if [[ "$name" == "$str3" ]];
then

run rosgenberger.txt
else
echo "no match found"
fi
fi
fi

脚本没有被执行,请帮忙。我想要的行动应该如下

  • 如果用户输入是“ace” --- run ace.txt 应该被执行
  • 如果用户输入是“com” --- 应该执行 run commscope.txt
  • 如果用户输入是“ros” --- run rosgenberger.txt 应该被执行。

我在 ace.txt/commscope.txt/rosgenberger.txt 脚本所在的路径中运行此脚本。

答案1

您可能想要执行如下操作:

#!/bin/sh

printf 'Enter name: ' >&2
read -r name

case $name in
    ace)
        run ace.txt
        ;;
    com)
        run commscope.txt
        ;;
    ros)
        run rosgenberger.txt
        ;;
    *)
        printf 'No match for "%s"\n' "$name"
esac

它从用户处读取“名称”并根据用户的响应执行命令。

bashshell 中,你可以使用更精简的东西:

#!/bin/bash

declare -A map=(
    [ace]=ace.txt
    [com]=commscope.txt
    [ros]=rosgenberger.txt
)

read -p 'Enter name: ' -r name

if [[ -n ${map[$name]} ]]; then
    run "${map[$name]}"
else
    printf 'No match for "%s"\n' "$name"
fi

这将设置一个关联数组,其中预期的“名称”作为键,相应的文件名作为值。根据用户的输入,命令将使用正确的文件名run

但大多数时候,您不想与用户交互,而是允许用户通过命令行选项简单地提供输入。以下内容通过使用通过命令行传递的第一个参数作为 的默认值来绕过输入的交互式提示name

#!/bin/bash

name=$1

declare -A map=(
    [ace]=ace.txt
    [com]=commscope.txt
    [ros]=rosgenberger.txt
)

if [[ -z $name ]]; then
    read -p 'Enter name: ' -r name
fi

if [[ -n ${map[$name]} ]]; then
    run "${map[$name]}"
else
    printf 'No match for "%s"\n' "$name"
fi

这将像这样使用:

./myscript ace

... 例如。然后该脚本将绕过交互式问题并执行run ace.txt

run通过让命令所需的变量扩展来完成我们的错误报告,可以进一步精简代码:

#!/bin/bash

name=$1

declare -A map=(
    [ace]=ace.txt
    [com]=commscope.txt
    [ros]=rosgenberger.txt
)

if [[ -z $name ]]; then
    read -p 'Enter name: ' -r name
fi

run "${map[$name]?Name $name not matched}"

这会输出类似的内容

line 15: map[$name]: Name Boo not matched

如果用户输入了名称Boo

答案2

假设您使用的是 Bash shell,请仔细查看这一行。没有readinput()定义函数,因此失败:

$name = readinput(Enter name:)

此外,变量赋值的两侧不能有空格=。作业不应以字符作为前缀$。也许可以尝试这个:

echo -n "Enter name:"
read name

另外,正如 @AdminBee 所暗示的那样,请务必在脚本的开头添加 shebang

相关内容