【问题标题】:Create if statement to iterate over a list of names and create name if not in list?创建 if 语句以遍历名称列表并创建名称(如果不在列表中)?
【发布时间】:2022-11-15 17:41:30
【问题描述】:

我正在使用 Azure 共享图像库并尝试编写 bash if 语句来遍历图像定义名称列表和if 图像定义名称不存在,创建它elif 等...

我有一个变量设置为:

defs=$(az sig image-definition list --resource-group $MyRG --gallery-name $mySIG --query [*].name) \
echo "$defs"

我试图做的是创建一个 if 语句,它将遍历我的 Azure 计算库中的这个图像定义名称列表,如果它不存在,则创建一个指定的名称。 我最初的假设类似于if [$defs != x,但不确定如何设置 x,因为对于想要创建新定义的人来说,这将是用户输入。

对不起,如果我的问题不清楚。 如果我可以提供更多信息,请告诉我。

我面临的问题是我对 bash 有所了解,但与我试图将其应用于我的 Azure 映像定义问题的确切程度无关。

【问题讨论】:

  • 请使用typeset -p defs 的完整输出更新问题,以便我们可以看到变量的确切内容;还可以考虑更新问题以显示您尝试过的完整/实际代码(以及示例值x)、代码生成的(错误)输出和(正确)预期输出;确保所有输出与defs 中的样本数据相对应
  • 要遍历数据集合,您需要一个列表,这在 bash 中意味着:一个索引数组。我建议您将defs 设为一个数组,然后在该数组上使用循环。

标签: bash shell if-statement azure-devops devops


【解决方案1】:

您可以使用read 要求用户输入。

$ read -p "please enter a definition: " x
please enter a definition: def4
$ echo $x
def4

然后,假设 $defs 是一个空格分隔的定义列表,可以执行以下操作:

# list of defs..
defs="def1 def2 def3"

# ask user to enter a definition
read -p "please enter a definition: " x

# set this to false until def is found
def_exists=false

# iterate over list of defs and see if user value is found
for i in ${defs}; do
  echo $i
  if [[ ${i} == "${x}" ]]; then
    echo "found it"
    def_exists=true
  fi
done

# if user def exists, good
if $def_exists; then
  echo "definition exists already.. nothing to do"

# otherwise...
else
  # do something
  echo "$x not found.. do stuff.."
fi

def 在现有列表中的示例:

please enter a definition: def1
def1
found it
def2
def3
definition exists already.. nothing to do

def 不在现有列表中的示例:

please enter a definition: def4
def1
def2
def3
def4 not found.. do stuff..

这就是我的defs 变量所包含的内容,以及上面的评论者要求您提供的内容,以便我们可以看到正在引用的数据类型。

$ typeset -p defs
declare -- defs="def1 def2 def3"

如果数据/定义有空格等。可以使用数组,或者我们可以查看其他选项。如果您发布一些定义示例,例如它们是一个词吗?多个带有空格的单词等。希望这会有所帮助!

【讨论】:

    【解决方案2】:

    可以使用全局参数 --query 和 --output 从 Azure CLI 中 az sig image-version list 的输出中查询列表。请参考:az sig image-definition

    例如:

    defs=$(az sig image-definition list --resource-group Wicresoft-Support --gallery-name douGallery --query [*].name --output tsv)
    

    然后使用 typeset -p defs 查看变量的确切内容。这是下图中的字符串结构。

    例如,这里是带有 Azure CLI 的 bash 脚本

    # convert to array
    defs_array=($defs)
    #declare -p defs_array
    # the length of array
    length=${#defs_array[@]}
    read -p "please enter a name: " x
    for i in ${defs_array[@]}
    do
    if [[ ${i} == $x ]]; then
        echo "found"
        break
    else
       if [[ ${i} == ${defs_array[-1]} ]];then
          echo "not found"
       fi 
    fi
    done
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-04
      • 2021-03-06
      • 2017-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      相关资源
      最近更新 更多