0

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

1 回答 1

1

你写了:

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

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

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

最后一个参数 ,]之前也必须有一个空格。其中的操作数也必须用空格分隔;它们需要是单独的论点。运算符的规则[[ ... ]]有点不同,但使用空格可以帮助人们阅读代码。你写的有点像期待:

ls"-l"/dev/tty

去工作; 它不会。

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


该行:

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

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

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

这将运行echoandawk命令并捕获var_check. 优先使用$(...)符号,而不是使用较旧但更复杂的`...`符号。在简单的情况下,它们看起来是一样的;当您嵌套它们时,$(...)符号非常容易理解和使用。

此外,在更大的范围内(3 行而不是 1 行):

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

您将文件名读入变量num;然后你 echo$str而不是$num. 如果您已经$str在脚本中的某个位置(在未显示的代码中)进行了设置,那么您所拥有的可能没问题。作为一个独立的片段,这是不对的。

您还可以简化awk一点:

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

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

于 2013-04-02T18:56:41.617 回答