Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Shell如何测试列表中是否存在项并影响变量中的结果_Linux_Bash_Shell_Scripting - Fatal编程技术网

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

Linux Shell如何测试列表中是否存在项并影响变量中的结果,linux,bash,shell,scripting,Linux,Bash,Shell,Scripting,我有一个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) 如果“moduleThree”出现在$modules列表中,则可能会发生变化: 示例: modules =

我有一个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)
如果“moduleThree”出现在$modules列表中,则可能会发生变化:

示例:

modules = moduleOne,moduleTwo,moduleThree   
modules = moduleOne,moduleThree,moduleFour
modules = moduleOne
就像那样,我得到的结果总是错误的


如何更正它?

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

IFS=, read -a module_list <<< "$2"

is_selected=false; for mod in "${module_list[@]}"; do [[ $mod = moduleThree ]] && is_selected=true; done
除非您需要为类似配置文件的内容选择
mod_three_selected
,否则直接使用阵列会更简单:

if [[ -v mod_array[moduleThree] ]]; then
    ....
fi
而不是

if [[ mod_three_selected = true ]]; then
    ....
fi

您似乎并没有实际使用
bash
,因此需要坚持使用符合POSIX的结构

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

尝试将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
用法


您的命令中缺少一个
]
。这是问题中的一个输入错误,还是问题的根源?@chepner只是问题的一个错误副本粘贴,但它确实存在,而且不起作用,
*
]]
之间是否有一个空格?Cn您重新设计了界面,以便不使用
/script server moduleOne,modulewo,moduleThree
您使用
/script server moduleOne modulewo moduleThree
,将模块列表作为单独的单词提供。如果模块名单独提供,则使用它们会更容易。@chepner是的,我有语法:错误:重定向意外,它似乎挂起:IFS=,readarray-模块列表你确定你在使用
bash
?是的,我用sh myscript运行它。sh
sh
不是
bash
在你的机器上;我猜你用的是Ubuntu,在这种情况下,
sh
就是
dash
。当您使用
sh myscript.sh
时,shebang被忽略。我在jenkinspipleine内部运行shell脚本,因此我无法用shell来运行它?正如我所说,模块可能会有所不同->示例->:module=moduleOne,moduleWO,moduleThree modules=moduleOne,moduleThree,moduleFor moduleOne=moduleOne
#!/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