如何使用if条件来比较unix中的字符串

时间:2015-03-13 13:01:37

标签: bash shell unix sh

我有一小段代码。而且我不确定我在哪里做错了。这是一个简单的IF条件,应该可以工作。

#!/bin/bash

flag1=$1
flag2=$2

if [ "$flag1"="C" ] && [ "$flag2"="C" ]
then
echo "Proceed"

else
echo "Fail"

fi

我正在运行它: - sh testif.sh C A. 和 sh testif.sh C C

我两个都得到了相同的结果。 继续

我是Unix Scripting的新手。请告诉我我在做什么大错。

抱歉,提出这样一个基本问题。

2 个答案:

答案 0 :(得分:3)

您需要bash令牌之间的空格:

if [ "$flag1" = "C" ] && [ "$flag2" = "C" ]

答案 1 :(得分:1)

Paul Evans's answer有适当的解决方案:您需要(至少)<{1}}等运算符周围的空格字符(及其等同于bash,= )。

至于为什么需要这个空间

Bash允许字符串连接,只需将令牌放在彼此旁边而不会有空格。 是否引用令牌,以及使用什么引用是无关紧要的; e.g:

==

在手头的情况下:

'ab'cd"ef"  # -> Bash sees: abcdef

换句话说:"$flag1"="C" # Bash eventually sees: <value-of-$flag1>=C 评估为单个,非空字符串文字,并将"$flag1"="C"应用于此类字符串 评估为真。

通常,请参阅POSIX shell规范中的http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html#tag_20_128。有关[ ... ]及其别名[如何处理不同数量的参数的信息(感谢@glennjackman)。

为了让Bash能够识别test的预期语法元素,您必须将每个元素至少分隔一个空格:{{ 1}}


如果您希望解决方案更多"$flag1"="C" - 比如请考虑使用"$flag1" = "C" 而不是POSIX语法{{1 }}:

bash

优点:

  • 允许您在 [[ ... ]]构造中使用<{1}}
  • 不需要对引用的引用进行双引号(尽管双引号永远不会受到伤害,并且在[ ... ] / if [[ $flag1 == "C" && $flag2 == "C" ]] # ... 右侧方面实际上非常重要,以区分字符串来自模式的文字)。
  • 表现稍好。

兼容性说明 &&适用于[[ ... ]]以及=== (虽然行为巧妙地说,它不符合POSIX标准。在需要考虑的情况下,请坚持使用[[ ... ]]