gpt4 book ai didi

linux - Bash 脚本中评估 azure 命令时的 while 循环被破坏

转载 作者:行者123 更新时间:2023-12-03 03:35:09 26 4
gpt4 key购买 nike

我有一个 csv 文件 params.csv,其中包含以下虚拟数据:

"Victor Okwuemu","n939NekyPa8910","VictorO003_gmail.com#EXT#@Hegemongroup.onmicrosoft.com"
"Jackson Kiraly","n939Nek00O1yPa","JacksonK004_gmail.com#EXT#@Hegemongroup.onmicrosoft.com"
"Benson Thomas","n939Nek025yPa","bensonT005_gmail.com#EXT#@Hegemongroup.onmicrosoft.com"

我使用 while 循环读取每一行,并根据逗号将每行中的字符串提取到变量中:displaynamepasswordupn 使用以下命令: $(echo $line | cut -d ","-f 1), $(echo $line | cut -d ","-f 2) $(echo $line | cut -d ","-f 3) 分别如下所示:

file='params.csv'
while read line; do
displayName=$(echo $line | cut -d "," -f 1)
password=$(echo $line | cut -d "," -f 2)
upn=$(echo $line | cut -d "," -f 3)
var1="az ad user create --display-name"
var2="--password"
var3="--user-principal-name"
eval ${var1} ${displayName} ${var2} ${password} ${var3} ${upn}
done < $file

我的目标是将提取的字符串传递到 Azure Active Directory CLI 命令中,以便在不使用 Azure 门户的情况下在 Azure Active Directory 租户中创建多个用户。

程序循环、评估第一行并将用户添加到我的 Azure Active Directory 租户,然后无法对文件中的其他行执行此操作。但是,当我注释掉“eval”行并回显变量时,while 循环会遍历每一行并提取每行的所有字符串。

我尝试过以各种其他格式编写命令,如下所示:

az ad user create --display-name "$displayName" --password "$password" --user-principal-name "$upn"
echo "az ad user create --display-name $displayName --password $password --user-principal-name $upn"
az ad user create --display-name $(echo $line | cut -d "," -f 1 | tr -d '"') --password $(echo $line | cut -d "," -f 2 | tr -d '"') --user-principal-name $(echo $line | cut -d "," -f 3 | tr -d '"')

所有这些方法都未能按照我的预期创建用户。有谁对此有想法吗?这里的问题是 while 循环在评估文件中的第一行后中断。

最佳答案

因为我们应该避免使用eval由于其脆弱性,尽可能地请您尝试一下:

#!/bin/bash

file="params.csv"
cmd=("az" "ad" "user" "create" "--display-name")
var2="--password"
var3="--user-principal-name"

while IFS=, read -r displayName password upn; do
"${cmd[@]}" "$displayName" "$var2" "$password" "$var3" "$upn"
done < <(tr -d '"' < "$file")
  • 您无需重复cut命令来分割线。 read内置函数通过分配 IFS 来为您完成此操作到定界性格。
  • 命令行参数可以放在数组中,而不是放在单字符串。
  • 周围的双引号被 tr 删除。命令,假设字符串中没有嵌入双引号。

顺便说一句,你的第一次试用 az ad user create --display-name "$displayName" ..失败因为变量保留周围的双引号,然后命令线相当于类似的东西 az ad user create --display-name "\"Victor Okwuemu\"" .. .

作为旁注,echo命令通常用于在调试时验证命令行,但请记住 echo有时特别欺骗我们关于引用。即使输出echo看起来不错,其实不然意味着参数已正确传递给命令。另一种方法是编写测试命令,例如:

#!/bin/bash
printf "%s\n" "$@"

逐行打印传递的参数。
尝试替换命令az./testcommand上面,运行并检查输出参数是否正确传递。

[编辑]
作为调试的一部分,您是否会使用以下命令执行脚本:

az ad user create --display-name "Victor Okwuemu" --password "n939NekyPa8910" --user-principal-name "VictorO003_gmail.com#EXT#@Hegemongroup.onmicrosoft.com"
az ad user create --display-name "Jackson Kiraly" --password "n939Nek00O1yPa" --user-principal-name "JacksonK004_gmail.com#EXT#@Hegemongroup.onmicrosoft.com"
az ad user create --display-name "Benson Thomas" --password "n939Nek025yPa" --user-principal-name "bensonT005_gmail.com#EXT#@Hegemongroup.onmicrosoft.com"

[编辑2]
为了测试目的,请尝试以下操作:

#!/bin/bash

cmd=("az" "ad" "user" "create" "--display-name")
var2="--password"
var3="--user-principal-name"

while IFS=, read -r displayName password upn; do
"${cmd[@]}" "$displayName" "$var2" "$password" "$var3" "$upn"
done < <(tr -d '"' <<EOS
"Victor Okwuemu","n939NekyPa8910","VictorO003_gmail.com#EXT#@Hegemongroup.onmicrosoft.com"
"Jackson Kiraly","n939Nek00O1yPa","JacksonK004_gmail.com#EXT#@Hegemongroup.onmicrosoft.com"
"Benson Thomas","n939Nek025yPa","bensonT005_gmail.com#EXT#@Hegemongroup.onmicrosoft.com"
EOS
)

[编辑3]
您可以尝试以下脚本来生成另一个脚本吗 newscript.sh它应该与 [Edit] 中的脚本相同:

#!/bin/bash

file="params.csv"
cmd=("az" "ad" "user" "create" "--display-name")
var2="--password"
var3="--user-principal-name"

{
echo "#!/bin/bash"
echo
while IFS=, read -r displayName password upn; do
echo "${cmd[@]}" "\"$displayName\"" "$var2" "\"$password\"" "$var3" "\"$upn\""
done < <(tr -d '"' < "$file")
} > newscript.sh

然后运行生成的脚本。

[编辑4]
这是 [Edit3] 的变体无需生成单独的脚本:

#!/bin/bash

file="params.csv"
cmd=("./az" "ad" "user" "create" "--display-name")
var2="--password"
var3="--user-principal-name"

while IFS=, read -r displayName password upn; do
echo "${cmd[@]}" "\"$displayName\"" "$var2" "\"$password\"" "$var3" "\"$upn\""
done < <(tr -d '"' < "$file") | bash -
  • 最终管道 | bash -提供先前处理的输出(或生成az命令行)直接到bash代替生成脚本文件。
  • 命令行中的双引号可能很棘手。最外面的双每个变量的引号均被 echo 删除和内在的(用反斜杠转义)在传递到 az 时被删除命令。尝试替换命令az./testcommand并查看我在第一个答案中指出的输出。

关于linux - Bash 脚本中评估 azure 命令时的 while 循环被破坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73622497/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com