我有一小段代码。而且我不确定我在哪里做错了。这是一个简单的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的新手。请告诉我我在做什么大错。
抱歉,提出这样一个基本问题。
答案 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标准。在需要考虑的情况下,请坚持使用[[ ... ]]
。