You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本执行Azure命令时while循环中断问题求助

解决Bash循环执行az ad user create仅处理第一行的问题

问题核心

你用while循环读取params.csv的每行数据,分割为用户信息后调用az ad user create批量创建Azure AD用户,但循环仅执行第一行就中断;注释掉az命令后,循环能正常遍历所有行。

根因分析

az命令默认会读取标准输入(stdin),而你的while循环是从stdin读取params.csv内容的。当第一个az命令执行时,它会把params.csv中剩余的行当作自己的输入消耗掉,导致while循环没有后续行可读,因此只执行一次。

解决方案

方法1:给az命令重定向输入到/dev/null

强制az命令不读取循环的stdin,让while循环能继续读取剩余行:

#!/bin/bash

while IFS=, read -r displayName password upn; do
    # 移除变量中的双引号
    displayName=${displayName//\"/}
    password=${password//\"/}
    upn=${upn//\"/}
    
    # 重定向az的输入到/dev/null,避免占用循环的stdin
    az ad user create --display-name "$displayName" --password "$password" --user-principal-name "$upn" < /dev/null
    
    # 可选:添加执行状态日志
    [ $? -eq 0 ] && echo "用户创建成功: $displayName" || echo "用户创建失败: $displayName"
done < params.csv

方法2:使用独立文件描述符读取CSV

通过文件描述符3读取params.csv,和az命令的stdin(默认是0)隔离,避免冲突:

#!/bin/bash

# 使用文件描述符3读取CSV文件
while IFS=, read -r -u3 displayName password upn; do
    # 清理变量中的双引号
    displayName=${displayName//\"/}
    password=${password//\"/}
    upn=${upn//\"/}
    
    az ad user create --display-name "$displayName" --password "$password" --user-principal-name "$upn"
done 3< params.csv

优化提示:高效清理双引号

用Bash参数展开替代tr命令,避免创建子shell,提升脚本效率:

# 替换变量中所有双引号
displayName=${displayName//\"/}

而非:

displayName=$(echo "$displayName" | tr -d '"')

为什么echo命令能正常运行?

echo命令不会读取标准输入,因此不会消耗params.csv的剩余行,循环可以正常遍历所有内容;而az命令会读取stdin,才导致了这个问题。

内容的提问来源于stack exchange,提问作者Stephen Okon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 22:50:35