Mac平台Flutter开发环境启动Bash脚本报错排查求助
Bash脚本错误排查与修复
错误原因分析
- 条件判断语法错误:
[是Bash内置命令,必须与后续表达式之间保留空格,原脚本中["$1" == "android"]会被解析为[a这样的无效命令,导致command not found报错。 - 变量赋值语法错误:Bash变量赋值时
=两端不能有空格,原脚本中local ip = "localhost"、android = true等写法均不符合语法;同时给变量赋值时不能加$前缀,比如$ip = ...是错误写法,正确应为ip=...。 - 未初始化默认变量:
android和device变量未设置默认值,可能导致后续条件判断逻辑异常。 - getopts错误处理语法错误:原脚本中
/?应为\?,Bash中?是特殊字符,需要转义才能匹配无效选项。
修复后的完整脚本
function main(){ check "$@" local ip="localhost" # 设置变量默认值 [[ -z $android ]] && android=true [[ -z $device ]] && device=false if $android; then if $device; then echo "Running On Android Device" ip=$(ipconfig getifaddr en0) else echo "Running On Android Simulator" ip="10.0.2.2" fi else if $device; then echo "Running On IOS Device" ip=$(ipconfig getifaddr en0) else echo "Running On IOS Simulator" ip="localhost" fi fi echo "IP: $ip" flutter run --dart-define="IP=$ip" } function check(){ local OPTIND opt while getopts ":p:d" opt; do case $opt in p) platform "$OPTARG";; d) device;; \?) help; exit 1 ;; :) echo "Option -$OPTARG requires an argument."; exit 1 ;; *) echo "Invalid option: -$OPTARG"; exit 1 ;; esac done } function platform(){ if [ "$1" == "android" ] || [ "$1" == "a" ]; then android=true elif [ "$1" == "ios" ] || [ "$1" == "i" ]; then android=false else echo "Invalid platform, running on android by default" android=true fi } function device(){ device=true } function help(){ echo "This script only accepts the following options:" echo "-p [android|a|ios|i] : select platform" echo "-d : run on actual device" } main "$@"
关键修复点说明
- 所有条件判断的
[后、]前添加空格,确保命令解析正确。 - 修正变量赋值语法,移除
=两端空格,赋值时不再使用$前缀。 - 在
main函数中为android和device设置默认值,避免未初始化导致的逻辑问题。 - 将
getopts中的/?改为\?,正确匹配无效选项。 - 传递参数时使用
"$@"而非$@,确保参数包含空格时也能正确解析。
内容的提问来源于stack exchange,提问作者Sami Al-Subhi
相关产品推荐
相关产品推荐

