3

我像这样运行我的脚本

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

而在 bash 中,变量“color”将被分配为“red blue yellow”或“red blue”

echo $collor
red blue yellow

两个问题:

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

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

谢谢

4

2 回答 2

1

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

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

这种方法的问题在于它不能很好地(或根本没有)处理单词边界;red将触发第一个条件,但orange-redand也会触发bored。此外,(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

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

于 2013-10-13T09:29:21.290 回答
0

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

你可以说:

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
于 2013-10-13T09:28:41.030 回答