AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / computer / 问题 / 1446419
Accepted
fma abd
fma abd
Asked: 2019-06-09 06:12:44 +0800 CST2019-06-09 06:12:44 +0800 CST 2019-06-09 06:12:44 +0800 CST

根据变量的动态值构造脚本参数

  • 772

团队,我有一组在此脚本 A 中定义的参数,它们的默认值为“DEFAULT”。当用户将这些变量参数设置为“DEFAULT”以外的任何值时,我必须运行另一个具有更新变量值的脚本,否则我将运行另一个具有默认值的脚本-B。所以,我有三种情况

我在脚本中模拟詹金斯参数设置。默认值是在设置为环境变量的 jenkins 作业上预设的,然后运行此脚本。因此,如果用户不更改任何参数并将所有 fio_gen 的值设置为默认值,那么它们将被我在脚本中定义的值替换。

1-Run Script-B with DEFAULT variable values
2-Run Script-B with all-non-DEFAULT variable values
3-Run Script-B with mixed variable values.. some default and some non. 

我的代码在下面,它确定哪些变量是默认变量而不是默认变量,但我想不出为上面的混合做 case-3 的逻辑。

我应该在 vars_ioengine_defaults 中使用关联数组并进行比较和使用吗?或者什么是好的方法?

#!/bin/bash
declare -a vars=(IOEngine TestType Threads BlockSize FileSize DatasetSize QueueDepth RunTime UDCName)
for var_name in "${vars[@]}"
do
 if [ -z "${!var_name}" ]; then
   echo "Missing environment variable $var_name"
   exit 1
 fi
done

#***Comment unComment to test 3 cases"
#DatasetSize="DEFAULT"
#BlockSize="DEFAULT"
#DatasetSize="nonDEFAULT"
#BlockSize="nonDEFAULT"
DatasetSize="DEFAULT"
BlockSize="NON-DEFAULT"


preset="DEFAULT"
declare -a dynamic_vars=( DatasetSize BlockSize )

number_of_dynamic_vars="${#dynamic_vars[@]}"
number_of_default_values=0

overwrite_all() {
        printf "all non-defaults variables\n"
    fio_gen
}
overwrite_some() {
        printf "some defaults variables\n"
    for [[ "${!var}" == "$preset" ]]
    do
     # SOME LOGIC HERE TO replace non-default and call this function
    fio_gen
    done
}
overwrite_none() {
        printf " all defaults variables\n"
    vars_ioengine_defaults
    fio_gen
}


check_vars() {
for var in "${dynamic_vars[@]}"
do
  [[ "${!var}" == "$preset" ]] && ((number_of_default_values++))
done

if [[ "$number_of_default_values" -eq 0 ]]; then
  echo "None var is default"
  overwrite_all
elif [[ "$number_of_default_values" -eq "$number_of_dynamic_vars" ]]; then
  echo "All defaults"
  overwrite_none
else
  echo "Mixed"
  overwrite_some
  echo $var
fi
}

vars_ioengine_defaults() {
  RunTime="0"
  UDCNAme="stage"
if [[ "$IOEnginge" == "psync" ]]  && [[ "$TestType" == "read" ]]; then
  QueueDepth="0"
  DatasetSize="3G"
  BlockSize="2,4,8,16,32,64,128,256,512,1024"
  Threads="1,2,4,8,16,32,64,128,256"
  FileSize="3M"
elif [[ "$IOEngine" == "psync" ]]  && [[ "$TestType" == "randread" ]]; then
  QueueDepth="0"
  DatasetSize="1G"
  BlockSize="8,16,32"
  Threads="16,32,64,128,256"
  FileSize="32k"
elif [[ "$IOEngine" == "libaio" ]]  && [[ "$TestType" == "read" ]]; then
  QueueDepth="16"
  DatasetSize="3G"
  BlockSize="2,4,8,16,32,64,128,256,512,1024"
  Threads="1,2,4,8,16,32,64,128,256"
  FileSize="3M"
elif [[ "$IOEngine" == "libaio" ]]  && [[ "$TestType" == "randread" ]]; then
  QueueDepth="16"
  DatasetSize="1G"
  BlockSize="8,16,32"
  Threads="16,32,64,128,256"
  FileSize="32k"
fi
}

fio_gen() {
    echo "iteratre on -p $IOEngine -t $TestType -j $Threads -b $BlockSize -s $FileSize -d $DatasetSize -q $QueueDepth -r $RunTime -u $UDCName"
}
check_vars
bash array
  • 2 2 个回答
  • 274 Views

2 个回答

  • Voted
  1. harrymc
    2019-06-09T08:54:19+08:002019-06-09T08:54:19+08:00

    如果问题是为 bash 脚本提供默认参数,那么我们的姊妹站点 Stack Overflow 上的帖子可以解决这个问题。

    如果参数是位置参数,您会在 如何编写采用可选输入参数的 bash 脚本?.

    这些解决方案使用Bash Reference Manual - 3.5.3 Shell Parameter Expansion中定义的 参数扩展,尤其是像${1:-foo}.

    例如,您可以在脚本中包含:

    ARG1=${1:-foo}
    ARG2=${2:-bar}
    ARG3=${4:-$(date)}
    

    上面的脚本要求缺少的参数始终是最后一个。

    如果您更愿意在脚本中使用命名参数,一些方法在将 命名参数传递给 shell 脚本一文中有所描述。

    对于帖子中的一个示例,如果您使用单字母参数,例如在 calling 中my_script -p '/some/path' -a5,您可以使用类似的代码来:

    while getopts ":a:p:" opt; do
      case $opt in
        a) arg_1="$OPTARG"
        ;;
        p) p_out="$OPTARG"
        ;;
        \?) echo "Invalid option -$OPTARG" >&2
        ;;
      esac
    done
    
    • 0
  2. Best Answer
    Kamil Maciorowski
    2019-06-11T14:31:26+08:002019-06-11T14:31:26+08:00

    这是实现以下过程的解决方案的存根:

    1. DFLT_源配置文件,其中所有默认值都在以前缀命名的变量中定义。例如DFLT_BlockSize定义默认值BlockSize。
    2. 对于每个默认变量(即名称以 开头的变量DFLT_)...
      1. 获取实际变量的名称;
      2. 如果实际变量下的值为DEFAULT,则将其替换为默认变量的值。

    让它成为我们的config.defaults:

    DFLT_BlockSize=5
    DFLT_DatasetSize="1 2 3 infinity"
    

    这是脚本:

    #!/bin/bash
    
    preset="DEFAULT"
    
    #***Comment unComment to test 3 cases"
    #DatasetSize="DEFAULT"
    #BlockSize="DEFAULT"
    #DatasetSize="nonDEFAULT"
    #BlockSize="nonDEFAULT"
    DatasetSize="DEFAULT"
    BlockSize="NON-DEFAULT"
    
    substitute_defaults() {
      local dvar var
      . "/path/to/config.defaults"   # use the actual path to the config
      for dvar in "${!DFLT_@}"; do
        var="${dvar#DFLT_}"
        declare -n var
        [[ "$var" == "$preset" ]] && var="${!dvar}"
        declare +n var
      done
    }
    
    substitute_defaults
    
    echo "$BlockSize"
    echo "$DatasetSize"
    

    解释:

    • "${!DFLT_@}"返回以 开头的所有变量的名称DFLT_。在循环的每次迭代中for扩展$dvar到下一个这样的名称,例如DFLT_BlockSize。
    • "${dvar#DFLT_}"删除"$dvar"了前导。DFLT_例如,如果$dvar扩展到DFLT_BlockSize然后${dvar#DFLT_}扩展到BlockSize。这存储为var.
    • declare -n var对 的值引用的变量执行所有引用、赋值和属性修改var(使用或更改属性本身的除外) 。在我们的示例中(用于扩展到)从现在开始表现得像并且表现得像。-nvar$varBlockSize$var$BlockSizevar=BlockSize=
    • ${!dvar}是类似的东西,没有declare -n: if $dvarexpands to DFLT_BlockSizethen ${!dvar}behaves like $DFLT_BlockSize。(如果我们这样做declare -n dvar,我们只$dvar需要获得相同的效果)。
    • 所以当$dvar扩展到时DFLT_BlockSize,该行

      [[ "$var" == "$preset" ]] && var="${!dvar}"
      

      表现得像

      [[ "$BlockSize" == "$preset" ]] && BlockSize="$DFLT_BlockSize"
      
    • 我们需要declare +n var( +nrevokes -n) 以便var="${dvar#DFLT_}"在下一个循环中更改var,而不是BlockSize。

    笔记:

    • 我为配置使用了一个不同的文件,只是为了将设置与代码分开。DFLT_您可以直接在脚本中定义这些变量(而不是. "/path/to/config.defaults")。
    • 由于config.defaults是 source,您应该将其视为脚本的一部分。特别是它绝不仅限于设置变量;您放入此文件中的任何代码都将被执行,就好像它在脚本本身中一样。但这也意味着您可以在配置文件中添加注释;或条件语句!(以防万一:foo=bar rm -rf /precious/data会运行rm!foo="bar rm -rf /precious/data"不会)。
    • 您可能希望将默认变量保留在函数的本地。在这种情况下,配置文件中的条目应该类似于local DFLT_foo=bar. 我决定保持示例文件简单,但local看起来合理。
    • 我的脚本不关心默认变量来自何处或它们引用的实际变量(或位置参数!)。尝试使用DFLT_1to affect$1会导致错误,因为位置参数的行为与常规变量有些不同。
    • 0

相关问题

  • 在 macOS High Sierra 的终端中设置环境变量时遇到问题

  • 对于 cp 或 mv,是否有等同于 cd - 的东西?

  • Notify-发送窗口下出现的通知

  • Excel 数组(2 个变量)

  • 如何从 WSL 打开 office 文件

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    Windows 10 服务称为 AarSvc_70f961。它是什么,我该如何禁用它?

    • 2 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Marko Smith

    ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败:无法获取本地颁发者证书 (_ssl.c:1056)

    • 4 个回答
  • Marko Smith

    我如何知道 Windows 安装在哪个驱动器上?

    • 6 个回答
  • Martin Hope
    Albin 支持结束后如何激活 WindowsXP? 2019-11-18 03:50:17 +0800 CST
  • Martin Hope
    fixer1234 “HTTPS Everywhere”仍然相关吗? 2019-10-27 18:06:25 +0800 CST
  • Martin Hope
    Kagaratsch Windows 10 删除大量小文件的速度非常慢。有什么办法可以加快速度吗? 2019-09-23 06:05:43 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    Inter Sys Ctrl+C 和 Ctrl+V 是如何工作的? 2019-05-15 02:51:21 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve