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
它从用户处读取“名称”并根据用户的响应执行命令。
在bash
shell 中,你可以使用更精简的东西:
#!/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