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

Shell如何测试列表中是否存在项并影响变量中的结果

  •  0
  • firasKoubaa  · 技术社区  · 4 年前

    我有一个shell脚本:

    #!/bin/bash
    server=$1
    modules=$2  #example of modules = moduleOne,moduleTwo,moduleThree   
    
    is_selected=$( if [[ $modules == *"moduleThree"* ]]; then echo true; else echo false; fi)
    

    我希望如果“ 模块树 “出现在列表$modules中,可能会更改:

    例如:

    modules = moduleOne,moduleTwo,moduleThree   
    modules = moduleOne,moduleThree,moduleFour
    modules = moduleOne
    

    这样我得到的结果总是错误的

    我该怎么纠正呢?

    1 回复  |  直到 4 年前
        1
  •  0
  •   Ivan    4 年前

    尝试将bash regex与 =~

    #!/bin/bash
    server=$1
    modules=$2  #example of modules = moduleOne,moduleTwo,moduleThree
    
    re='.*moduleThree.*'
    [[ $modules =~ $re ]] && is_selected='true' || is_selected='false'
    echo $is_selected
    

    用法

    $ ./test srv moduleOne,moduleTwo
    false
    
    $ ./test srv moduleOne,moduleThree,moduleTwo
    true
    
        2
  •  0
  •   chepner    4 年前

    如果有逗号分隔的字符串,请使用该字符串填充数组,然后扫描数组以查找正确的模块。

    IFS=, read -a module_list <<< "$2"
    
    is_selected=false; for mod in "${module_list[@]}"; do [[ $mod = moduleThree ]] && is_selected=true; done
    

    如果您计划检查多个模块的列表,那么可以从中创建关联数组 module_list ,以便您可以在固定时间内进行查找:

    declare -A mod_array
    for mod in "${module_list[@]}"; do
      mod_array[$mod]=
    done
    
    mod_three_selected=false; [[ -v mod_array[moduleThree] ]] && mod_three_selected=true
    

    除非你需要 mod_three_selected 对于配置文件之类的东西,直接使用阵列会更简单:

    if [[ -v mod_array[moduleThree] ]]; then
        ....
    fi
    

    而不是

    if [[ mod_three_selected = true ]]; then
        ....
    fi
    
        3
  •  0
  •   chepner    4 年前

    你似乎没有真正使用 bash ,所以您需要坚持使用符合POSIX的结构。

    case $2 in
      moduleThree,*|,moduleThree,|*,moduleThree) is_selected=true ;;
      *) is_selected=false
    esac