我试图找出在单行shell脚本中使用while循环和if语句检查多个条件的语法。
执行类似的事情......
i=2; while [ $i -le 10 ]; do if [ $i -ne 3 -a $i -ne 5 ] echo $i " not equal to 3 or 5"; else echo $i; i=`expr $i + 1`; done
...我收到了错误
bash: syntax error near unexpected token `else'
另一方面,如果我从...3 or 5"
和else echo...
之间删除分号,并尝试这样的话......
i=2; while [ $i -le 10 ]; do if [ $i -ne 3 -a $i -ne 5 ] echo $i " not equal to 3 or 5" else echo $i; i=`expr $i + 1`; done
...然后我收到错误:
syntax error near unexpected token `done'
这是在Ubuntu 14.04上,如果重要的话。
我可能在某个地方遗漏了某种括号,还是其他的东西?
答案 0 :(得分:2)
这应该有效:
i=2; while [ $i -le 10 ]; do if [ $i -ne 3 -a $i -ne 5 ]; then echo $i " not equal to 3 or 5"; else echo $i; fi; i=`expr $i + 1`; done
这也应该有效:
i=2; while [ $i -le 10 ]; do [ $i -ne 3 -a $i -ne 5 ] && echo "$i not equal to 3 or 5" || echo $i; i=$((i+1)); done
但我不确定在一行中写这个是否有意义
答案 1 :(得分:1)
您仍然需要then
和fi
以及足够的分号。
i=2; while [ $i -le 10 ]; do if [ $i -ne 3 -a $i -ne 5 ]; then echo "$i not equal to 3 or 5"; else echo $i; fi; i=$(expr $i + 1); done
将后引号`…`
替换为$(…)
只是一个总体好主意,对此次讨论并不重要。
如果按常规方式在多行(没有分号)上写出来,你就有:
i=2
while [ $i -le 10 ]
do
if [ $i -ne 3 -a $i -ne 5 ]
then echo "$i not equal to 3 or 5"
else echo $i
fi
i=$(expr $i + 1)
done
要将其转换为单行,您需要在每个语句和条件后使用分号:
i=2;
while [ $i -le 10 ];
do
if [ $i -ne 3 -a $i -ne 5 ];
then echo "$i not equal to 3 or 5";
else echo $i;
fi;
i=$(expr $i + 1);
done
现在,空格(包括换行符)可以在一行中用单个空格替换。
您可以使用i=$(($i + 1))
或甚至(在Bash中)((i++))
代替expr
,这可以避免使用外部命令expr
; shell在内部进行算术运算。
答案 2 :(得分:0)
每个if
都需要then
和fi
:
i=2; while [ $i -le 10 ]; do if [ $i -ne 3 -a $i -ne 5 ] ; then echo $i " not equal to 3 or 5" ; else echo $i; i=`expr $i + 1`; fi ; done