代码之家  ›  专栏  ›  技术社区  ›  Plankt0n

Shell,执行一个需要逐一遍历多个值的命令

  •  1
  • Plankt0n  · 技术社区  · 5 月前

    我有一个脚本:

    if [ $ModEnabled == "1" ];then
        ${HOME}/servers/steamcmd/steamcmd.sh +force_install_dir ${HOME}/servers/dayzserver/ +login "${SteamUser}"  +workshop_download_item 221100 1559212036 validate +quit
        printf "Done"
    else
        echo "Variable is not set"
    fi
    

    但是,我需要做的是运行该命令 +workshop_download_item 221100 1559212036 validate

    当它重新运行/循环该命令时,将特定值“1559212036”替换为多个值的列表。

    愿景是:(假代码,显然哈哈)

    modlist={"
        123123123,
        234456567,
        456456456,
        567567567,"
    }
    

    那么这将运行:

    ${HOME}/servers/steamcmd/steamcmd.sh +force_install_dir ${HOME}/servers/dayzserver/ +login "${SteamUser}"  +workshop_download_item 221100 $modlist, then run again with the next item in modlist" validate +quit
    

    如果可以在不每次调用“+quit”的情况下做到这一点,那将是一个额外的好处(但我想这是steamcmd的事情。

    3 回复  |  直到 5 月前
        1
  •  1
  •   White Owl    5 月前

    你可以这样做:

    for mod in 123123123 234456567 456456456 567567567
    do
       ${HOME}/servers/steamcmd/steamcmd.sh \
          +force_install_dir ${HOME}/servers/dayzserver/ \
          +login "${SteamUser}"  \
          +workshop_download_item 221100 $mod \
          validate +quit
    done
    

    在这种情况下 $mod 变量将在关键字后定义值 in 逐一地。

        2
  •  0
  •   user513951    5 月前

    您要查找的构造是 for loop .

    DayZModList="
    123123
    456456
    789789
    "
    
    if [ $ModEnabled == "1" ];then
        for value in $DayZModList ; do
            ${HOME}/servers/steamcmd/steamcmd.sh \
            +force_install_dir ${HOME}/servers/dayzserver/ \
            +login "${SteamUser}" \
            +workshop_download_item 221100 "${value}" \
            validate +quit
        done
    
        printf "Done"
    else
        echo "Variable is not set"
    fi
    

    您设置了迭代器(我使用了变量名 value ,但你可以使用任何你喜欢的东西),然后使用(在这个例子中)访问它 "${value}" .

        3
  •  -2
  •   Plankt0n    5 月前

    好吧,我很快就聊过了。这是以下代码:

    #Configure if using mods. 
    ModEnabled="1" # If 1 = Install/update mods 
    DayZModList=("1559212036" "1828439124" "2545327648"
    
    #Update Mods
    if [ $ModEnabled == "1" ];then
        printf "[ ${yellow}REALM-SERVER${default} ] Updating/Downloading Mod files!\n"
        for value in ${DayZModList[@]}; do
            ${HOME}/servers/steamcmd/steamcmd.sh +force_install_dir ${HOME}/servers/dayzserver/ +login "${SteamUser}"  +workshop_download_item 221100 "${DayZModList}" validate +quit
            printf "[ ${green}REALM-SERVER${default} ] Done downloading and updating Mod files!\n"
        done
    else
        printf "[ ${red}Error${default} ] You have not enabled downloading and updating mods, skipping!\n"
    fi
    

    然而,它跳过了“1559212036”之后的所有内容,实际上并没有下载它们。