Linux Shell如何测试列表中是否存在项并影响变量中的结果
我有一个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 =
#!/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运行它。shsh
不是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