如何将数组的值与bash脚本中的变量进行比较?

时间:2016-11-15 04:12:36

标签: linux bash unix

我练习bash,说实话,非常有趣。但是,我试图编写一个程序,将数组的值与变量进行比较,如果它们相同则应该打印数组值,并在其左侧打一个星号。 `

#!/bin/bash

color[0]=red
color[1]=blue
color[2]=black
color[3]=brown
color[4]=yellow
favorite="black"
for i in {0..4};do echo ${color[$i]};
if {"$favorite"=$color[i]}; then
    echo"* $color[i]"
done

输出应为= *黑色

1 个答案:

答案 0 :(得分:3)

您的代码中有一些不正确的语句会阻止它执行您的要求。 bash中的比较是用方括号完成的,在它们周围留出空间。您正确使用=进行字符串比较,但应将"括在字符串变量中。此外,虽然您在echo语句中正确地处理了元素数组,但在比较中不应该这样做,它也应该在${color[$i]}中读取。{1}}。星号打印中的错误相同。所以,这里有一个带有修复程序的返工代码,但请在下面阅读更多内容。

#!/bin/bash

color[0]=red
color[1]=blue
color[2]=black
color[3]=brown
color[4]=yellow
favorite=black
for i in {0..4};do
   echo ${color[$i]};
   if [ "$favorite" = "${color[$i]}" ]; then
      echo "* ${color[$i]}"
   fi
done

虽然该代码现在可以使用,但很少有我喜欢和建议的东西(SO社区当然可以接受更专家的输入):始终将字符串括在"中,因为它显示它是一个字符串变量;循环数组时,不需要使用索引变量;将变量始终包含在${}内。 所以我的相同代码的版本将是:

#!/bin/bash
color=("red" "blue" "black" "brown" "yellow")
favorite="black"
for item in ${color[@]}; do
   echo ${item}
   if [ "${item}" = "${favorite}" ]; then
     echo "* $item"
   fi
done

这里有一个指向优秀的高级Bash-Scripting Guide的指针:http://tldp.org/LDP/abs/html/