如何使用while循环和if语句编写单行shell脚本

时间:2015-12-26 22:03:30

标签: linux shell

我试图找出在单行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上,如果重要的话。

我可能在某个地方遗漏了某种括号,还是其他的东西?

3 个答案:

答案 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)

您仍然需要thenfi以及足够的分号。

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都需要thenfi

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