Bash脚本if/else变量赋值报错及输入格式优化求助
问题分析与解决方案
1. 为什么aws_account被识别为命令?
这是Bash变量赋值的基础语法错误:变量名和等号之间绝对不能有空格。你写的aws_account = "lab"会被Bash解析为:尝试执行名为aws_account的命令,同时把=和"lab"作为它的参数。但系统里根本没有这个命令,所以才会报command not found的错误。正确的写法是去掉等号两边的空格:
aws_account="lab"
2. 根据用户输入正确赋值变量
你当前的脚本逻辑是遍历数组后硬编码判断元素,没法关联用户输入的accountnumber。我给你两种优化方案,适配不同场景:
方案一:用关联数组(Bash 4.0+推荐)
关联数组可以直接建立"账号编号-账号名称"的映射,逻辑更清晰,后续新增账号也更方便:
#!/bin/bash # 让提示和输入在同一行的写法 read -p "What AWS Account: " accountnumber echo "You entered $accountnumber" # 定义账号映射关联数组 declare -A account_map=( ["1234556789"]="lab" ["1234567810"]="bill" ) # 检查用户输入是否在映射中 if [[ -n "${account_map[$accountnumber]}" ]]; then aws_account="${account_map[$accountnumber]}" echo "You are currently in account: $aws_account" else echo "Unknown account" fi
方案二:用if-elif判断(兼容低版本Bash)
如果你的Bash版本低于4.0(不支持关联数组),可以直接用条件判断匹配用户输入:
#!/bin/bash read -p "What AWS Account: " accountnumber echo "You entered $accountnumber" aws_account="" if [[ "$accountnumber" == "1234556789" ]]; then aws_account="lab" elif [[ "$accountnumber" == "1234567810" ]]; then aws_account="bill" else echo "Unknown account" exit 1 # 可选:如果是未知账号直接终止脚本 fi echo "You are currently in account: $aws_account"
3. 让用户输入与提问文本显示在同一行
使用read命令的-p参数即可实现,它可以直接指定提示文本,并且让输入光标紧跟在提示文本后面,不需要单独用echo输出提示。比如:
read -p "What AWS Account: " accountnumber
运行时就会显示:What AWS Account: 1234556789(用户输入内容和提示在同一行)
小提示
对比字符串时,建议用[[ ... ]]而不是传统的[ ... ],[[是Bash的扩展语法,处理带空格的字符串更安全,也不需要额外对变量加引号(当然加引号更稳妥)。另外,AWS账号虽然是数字,但作为字符串处理更合适,避免出现数字解析的意外问题。
内容的提问来源于stack exchange,提问作者bluethundr
相关产品推荐
相关产品推荐

