如果条件在检查两个字符串时在shell脚本中给出错误

时间:2013-04-02 18:54:31

标签: linux shell

在下面的shell脚本中,我想根据文件类型执行两个不同的任务, 但它给出了一个错误:"[==c]: command not found"

echo "enter file name"
read num
var_check= echo $str |awk -F . '{if (NF>1) {print $NF}}'

if ["$var_check"=="c"];then
    echo "Some task for c"
elif ["$var_check"=="cpp"];then
    echo "Some task for cpp"
else
    echo "Wrong file extension"
fi

1 个答案:

答案 0 :(得分:1)

您写道:

if ["$var_check"=="c"];then

[命令是一个命令;它的名字必须用空格包围(简单地说)。

if [ "$var_check" == "c" ]; then

最后一个参数]也必须以空格开头。内部的操作数也必须是空间分隔的;他们需要单独的论点。 [[ ... ]]运算符的规则略有不同,但使用空格可以帮助人们在那里读取代码。你写的有点像期待:

ls"-l"/dev/tty

上班;它不会。

您还需要仔细检查test[运营商是否支持==;正常形式为=


该行:

var_check= echo $str |awk -F . '{if (NF>1) {print $NF}}'

这会运行echo命令并将var_check设置为环境变量,这不太可能是您想要的。你几乎肯定打算写:

var_check=$(echo $str |awk -F . '{if (NF>1) {print $NF}}')

这会运行echoawk命令并捕获var_check中的输出。使用$(...)表示法优先于较旧但更复杂的表示法来使用`...`表示法。在简单的情况下,它们看起来一样;当你嵌套它们时,$(...)符号远远不易理解和使用。

另外,查看较大的比例(3行而不是1行):

echo "enter file name"
read num
var_check=$(echo $str |awk -F . '{if (NF>1) {print $NF}}')

您将文件名读入变量num;然后,您回复$str而不是$num。如果你已经在脚本中的某个地方设置了$str(在未显示的代码中),你所得到的可能没问题。作为一个独立的片段,它是不对的。

您还可以简化awk一点:

var_check=$(echo $str |awk -F . 'NF > 1 {print $NF}')

这与您编写的内容相同,但使用较少的括号和大括号。