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
相关产品推荐
相关产品推荐

