Shell脚本实现按传入参数停止单台/全部Azure虚拟机求助
修正后的Shell脚本
#!/bin/bash # 请根据实际业务场景修改以下全局变量配置 WORKSPACE="/你的工作目录绝对路径" SCRIPTS_DIR="脚本存放目录名" RESOURCE_GROUP="你的Azure资源组名称" # 预设需要批量操作的服务器列表 PRESET_VMS=("perf-ld" "perf-ld2" "perf-loadgen2") # 停止服务器函数 shut_all_vm(){ cd "$WORKSPACE/$SCRIPTS_DIR" || exit 1 # 登录操作仅执行一次,避免循环内重复调用 az login for vm in "$@"; do echo "正在停止服务器: $vm" az vm stop --resource-group "$RESOURCE_GROUP" --name "$vm" az vm deallocate -g "$RESOURCE_GROUP" -n "$vm" echo "$vm 服务器已成功停止" done } # 启动服务器函数,按需调用 start_all_vm(){ cd "$WORKSPACE/$SCRIPTS_DIR" || exit 1 az login for vm in "$@"; do echo "正在启动服务器: $vm" az vm start --resource-group "$RESOURCE_GROUP" --name "$vm" echo "$vm 服务器已成功启动" done } # 入参处理逻辑 if [ $# -eq 0 ]; then # 无参数调用默认启动所有预设服务器 start_all_vm "${PRESET_VMS[@]}" else OP_TYPE="$1" if [ $# -ge 2 ]; then # 传入指定服务器名,仅操作该单台服务器 TARGET_VMS=("$2") else # 未传服务器名,操作所有预设服务器 TARGET_VMS=("${PRESET_VMS[@]}") fi # 执行对应操作 "$OP_TYPE" "${TARGET_VMS[@]}" fi
核心修改说明
- 重构目标服务器列表生成逻辑:传入第二个参数时仅操作指定服务器,未传时自动加载预设的服务器列表,完全匹配需求
- 将az登录操作移出循环,避免每操作一台服务器就重复执行一次登录
- 增加路径切换异常退出逻辑,cd失败时直接终止脚本避免后续操作异常
- 所有变量统一用双引号包裹,规避路径、名称含空格时的语法错误
- 补充默认操作逻辑,无参数调用时默认执行启动所有VM的操作,符合调用示例要求
- 新增配套启动函数,可直接调用实现批量/指定服务器启动
使用示例
- 启动所有预设VM:
./script.sh - 停止所有预设VM:
./script.sh shut_all_vm - 仅停止perf-loadgen2服务器:
./script.sh shut_all_vm perf-loadgen2 - 仅启动perf-ld服务器:
./script.sh start_all_vm perf-ld
提示:如果已经配置了Azure CLI免密登录,可以删除脚本中的
az login相关代码
内容的提问来源于stack exchange,提问作者Kandikuppa Vinod
相关产品推荐
相关产品推荐

