繁体   English   中英

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

[英]If condition giving error in shell script when checking two strings

在下面的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

你写了:

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}')

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM