如何检查一个参数是否包含某些单词

我运行我的脚本

./test.sh -c "red blue yellow" ./test.sh -c "red blue" 

bash中,variables“collor”将被分配为“红色蓝色黄色”或“红色蓝色”

 echo $collor red blue yellow 

两个问题:

答:“红”对我来说是一个重要的参数,我怎么知道红是否包含可比的颜色?

 if [ red is in color] ; then "my operation" 

B:我有一个只有3种颜色的颜色列表,如何检查是否有未定义的颜色传递给脚本

 ./test.sh -c "red green yellow" 

我怎样才能定义颜色列表,我怎么做检查,以便我能得到的打印

 Warnings: wrong color is green is passed to script 

谢谢

(A)可以使用通配符字符串比较来处理:

 if [[ "$color" = *red* ]]; then echo 'I am the Red Queen!' elif [[ "$color" = *white* ]]; then echo 'I am the White Queen!' fi 

这种方法的问题在于它不能很好地处理单词边界(或根本不处理)。 red会触发第一个条件,但是orange-redbored 。 另外,(B)将难以(或不可能)以这种方式实施。

处理这个问题的最好方法是将颜色列表分配给Bash数组 :

 COLORS=($color) for i in "${COLORS[@]}"; do if [[ "$i" = "red" ]]; then echo 'I am the Red Queen!' elif [[ "$i" = "white" ]]; then echo 'I am the White Queen!' fi done 

然后,您可以使用嵌套循环遍历包含允许的颜色的另一个数组,并报告在其中找不到的任何输入颜色。

答:“红”对我来说是一个重要的参数,我怎么知道红是否包含可比的颜色?

你可以说:

 if [[ "$2" == *red* ]]; then echo "Color red is present ..." fi 

只有red被包含在脚本的参数中( ./test.sh -c "red blue yellow" ),条件才会成立。

B:我有一个只有3种颜色的颜色列表,如何检查是否有未定义的颜色传递给脚本

 colors=(red blue yellow) # color list with three colors IFS=$' ' read -a foo <<< "$2" echo "${#foo[@]}" for color in "${foo[@]}"; do if [[ "${colors[@]}" != *${color}* ]]; then echo incorrect color $color fi done