比较 Bash 中的两个字符串

Dem*_*eep 22 bash shell-script test

我的ifbash 脚本中有以下块:

if [ ${PACKAGENAME} -eq kakadu-v6_4-00902C ]; then
  echo "successfully entered if block!!"
fi
Run Code Online (Sandbox Code Playgroud)

该脚本执行不进入我的if块,即使$PACKAGENAME是相同kakadu-v6_4-00902C。我究竟做错了什么?

pol*_*lym 32

-eq 是一个算术运算符,它比较两个数字。

使用=(portable/standard sh),=~或者==代替。

也使用引号,因为如果${PACKAGENAME}包含空格或通配符,那么它将被拆分为多个参数,这会导致[看到比所需更多的参数。请参阅此处的常见 bash 陷阱列表。

if [ "${PACKAGENAME}" = 'kakadu-v6_4-00902C' ]; then
    echo "successfully entered if block!!"
fi
Run Code Online (Sandbox Code Playgroud)

man bash,搜索(/CONDITIONAL EXPRESSIONS

  • 在双括号内,没有进行分词,所以`[[ $PACKAGENAME == "kakadu..." ]]` 是可以的。 (4认同)
  • @glennjackman 但是请注意,即使在双括号内,您也需要在 `=`、`==` 和 `!=` 右侧的变量扩展周围使用双引号,因为该侧是一个模式,而不是一个字符串。例如,`foo='*'; [[whatever = $foo ]]` 为真。 (4认同)
  • 你有没有看过 http://www.tldp.org/LDP/Bash-Beginners-Guide/html/ ?这是一个非常好的 bash 指南,它将帮助您提供示例和考试:)。 (2认同)

beg*_*ner 6

替换-eq== 这样您的 if 块将是这样的:-

if [ ${PACKAGENAME} == kakadu-v6_4-00902C ]; then

        echo "successfully entered if block!!"

fi
Run Code Online (Sandbox Code Playgroud)

  • 不要忘记引用!看看这里,为什么:http://mywiki.wooledge.org/BashPitfalls#A.5B_.24foo_.3D_.22bar.22_.5D (5认同)