在下面的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
答案 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}}')
这会运行echo
和awk
命令并捕获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}')
这与您编写的内容相同,但使用较少的括号和大括号。